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);
        }
    }
}

ASP.NET MVC 替代渲染编辑器用于基于用户角色

您可以为此创建自定义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