ASP.NET MVC 替代渲染编辑器用于基于用户角色
本文关键字:于用户 用户 角色 用于 编辑器 MVC NET ASP | 更新日期: 2023-09-27 18:32:00
我有一个包含当前用户属性的基本视图模型类,我需要 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<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> 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<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> 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
,然后您不必每次要使用它时都包含命名空间:
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization"/>
<add namespace="System.Web.Routing" />
<add namespace="MyAppName.Helpers" /> //Here the helper reference
</namespaces>
</pages>
</system.web.webPages.razor>
希望这对您有所帮助!
尝试使用扩展方法。可以使用所需的方法创建静态类(不能是非静态或嵌套的),其中一个参数是 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