Im使用asp.net mvc 2.0。我有以下HtmlHelper扩展:
AdminOnly(HtmlHelper helper, IPrincipal User, string htmlToRender)
{
//Render Html if have admin access.
}
我需要修改它以这样的方式使用:AdminOnly(用户).TextBoxFor(x=>x.MyField)因此,只有当用户具有管理员访问权限时,它才能为MyField呈现编辑字段。
目前,我提出了以下解决方案:
AdminOnly(this MvcHtmlString resString, IPrincipal User)
{
//Render Html if have admin access.
}
所以在代码中,我可以写一些东西,比如:
<%:Html.TextBoxFor(x=>x.MyProperty).AdminOnly(User)%>
它是有效的,但我希望能够添加更多的输入或更灵活地在输入前后添加文本,比如:
<%:Html.PlainText("Set your age: ").TextBoxFor(x=>x.Age).AdminOnly(User)%>
或
<%: Html.AdminOnly("Set your age: ", User).AddTextBoxFor(x=>x.Age)%>
1)如果您不希望渲染当前标识以外的内容,并且您使用的是Thread.CurrentPrincipal
,我建议省去user
参数,使用HttpContext.Current.User
或Thread.CurrentPrincipal
。
2) 使用链式方法调用可能需要相当多的工作,相反,我建议利用lambda表达式。
扩展:
public static MvcHtmlString AdminOnly(this HtmlHelper htmlHelper, Func<MvcHtmlString> action)
{
if (HttpContext.Current.User.IsInRole("admin"))
return action();
return MvcHtmlString.Empty;
}
用法:
<%: Html.AdminOnly(() => Html.TextBoxFor(m => m.Field)) %>
edit:更新为mvc 2