9

我有一个包含当前用户属性的基本视图模型类,我需要 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);
        }
    }

}
4

3 回答 3

8

You can create a custom HTML Helper for this, for exemple:

1) Add new Class to your project, this will contain the helper. Just make sure that the used model contains the 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) Add the namespace to the Web.config in the Views folder, then you don't have to include the namespace every time you want to use it:

<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>

Hopes this help you!

于 2013-09-18T14:08:53.593 回答
0

尝试使用扩展方法。可以使用您需要的方法创建静态类(不能是非静态或嵌套的),其中一个参数是 Html,并使用“this”关键字进行标记。您可以在此处找到更多信息:http: //msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx

于 2013-09-18T13:55:39.397 回答
0

您可以创建一个 HTML 辅助方法。一种方法是创建一个带有静态方法的新类,该方法返回一串用于呈现的 html。或者您可以扩展现有的 html 帮助程序类。

这里有一个很棒的 asp.net 演练:http ://www.asp.net/mvc/tutorials/older-versions/views/creating-custom-html-helpers-cs

于 2013-09-18T13:59:18.717 回答