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

HTML Helperたとえば、このためのカスタムを作成できます。

1) プロジェクトに new を追加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);
        }
    }
}

Web.config2)名前空間をフォルダー内に追加するとViews、使用するたびに名前空間を含める必要がなくなります。

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

これがお役に立てば幸いです。

于 2013-09-18T14:08:53.593 に答える
0

HTML ヘルパー メソッドを作成できます。これを行う 1 つの方法は、レンダリング用の html の文字列を返す静的メソッドを持つ新しいクラスを作成することです。または、既存の html ヘルパー クラスを拡張することもできます。

ここに素晴らしいasp.netウォークスルーがあります:http://www.asp.net/mvc/tutorials/older-versions/views/creating-custom-html-helpers-cs

于 2013-09-18T13:59:18.717 に答える