ASP.NET MVC或者渲染EditorFor基于用户角色
我有一个包含当前用户属性的基本viewmodel类,我需要MVC根据用户的管理状态呈现文本框或标签。
目前,我正在这样做,但代码必须重复很多。
@if (Model.CurrentUser.Admin) { @Html.EditorFor(m => m.Order.CustomerDiscount); } else { @Html.DisplayFor(m => m.Order.CustomerDiscount); }
是否可以创建自定义编辑器扩展?
@Html.PrivilegedEditorFor(m=>m.Order.CustomerDiscount);
编辑:
感谢@Fals。 这里略有不同的解决方案:
using System.Web.Mvc.Html; public static class HtmlHelperExtensions { public static MvcHtmlString PrivilegedEditorFor(this HtmlHelper htmlHelper, Expression<Func> expression, bool isAdmin) { if (isAdmin) { return htmlHelper.EditorFor(expression); } else { return htmlHelper.DisplayFor(expression); } } }
您可以为此创建自定义HTML Helper
程序,例如:
1)将新Class
添加到项目中,这将包含帮助程序。 只需确保使用的模型包含CurrentUser.Admin
。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Helpers; using System.Web.Mvc.Html; using System.Linq.Expressions; namespace MyAppName.Helpers { public static class HtmlPrivilegedHelper { public static MvcHtmlString PrivilegedEditorFor(this HtmlHelper html, Expression> expression) { // You can access the Model passed to the strongly typed view this way if (html.ViewData.Model.CurrentUser.Admin) { return html.EditorFor(expression); } return html.DisplayFor(expression); } } }
2)将名称空间添加到Views
文件夹中的Web.config
,然后每次要使用它时都不必包含名称空间:
//Here the helper reference
希望这对你有所帮助!
尝试使用扩展方法。 可以使用您需要的方法创建静态类(不能是非静态的或嵌套的),其中一个参数是Html,并使用“this”关键字进行标记。 您可以在此处找到更多信息: http : //msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx
您可以创建HTML帮助程序方法。 一种方法是使用静态方法创建一个新类,该方法返回一个用于呈现的html字符串。 或者您可以扩展现有的html帮助程序类。
这里有一个很棒的asp.net演练: http : //www.asp.net/mvc/tutorials/older-versions/views/creating-custom-html-helpers-cs
- ASP.NET MVC ViewModel和DropDownList
- 我该如何调试EF? (分析SQL查询)
- 控制器错误“Microsoft.AspNetCore.Mvc.Rendering.SelectListItem”中的MVC Core SelectList下拉列表
- 将AjaxOnlyAttribute和ChildActionOnlyAttribute组合到一个动作filter中
- 图Api – 401未经授权
- 转换/修改asp.net标识中的声明2
- 三层asp.net mvc应用程序中的dependency injection
- 如何在URL中更改ASP.NET MVC控制器名称?
- 检查null的性能损失