1

私が取り組んでいるプロジェクトでは、モデルで提供されるメタデータに基づいて、エディター テンプレートをその表示テンプレートにリダイレクトするように依頼されました。

今、エディター テンプレートにヒットする前にそれを行う方法を検討していましたが、少なくともシステムがどのように設計されているかについては、価値があるよりも多くの問題を引き起こしているようです。

最も単純な例は文字列エディターで、単純なテキスト ボックスですが、IsReadOnly が設定されている場合は、無効なテキスト ボックスではなく、テキストとしてのみ表示されるようにします。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%
    if (this.ViewData.ModelMetadata.IsReadOnly)
    {
        Response.Write(Html.DisplayForModel());
    }
    else if (this.ViewData.ModelMetadata.ShowForEdit)
    {
<%= Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class = "text-box single-line" }) %>
<% } %>

これまでのところ、私が見つけた唯一の本当の解決策は、表示テンプレートをエディター テンプレートにコピーすることです。より多くのコードを複製せずに機能する何かを行う方法を知っている人はいますか?

4

1 に答える 1

1

エディター テンプレート自体の外でこれを実行しないのはなぜですか? プロパティが読み取り専用かどうかをチェックする拡張メソッドを定義してから、編集テンプレートまたは表示テンプレートを表示します。この回答PropertyHelperからクラスをコピーする必要があります。

public MvcHtmlString DisplayOrEditFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> selector)
{
    var property = PropertyHelper<TModel>.GetProperty(selector);
    if(property.CanWrite)
    {
        return helper.EditorFor(selector);
    }
    return helper.DisplayFor(selector);
}

次に、あなたの見解では、

<%: Html.DisplayOrEditFor(x => x.Name) %>

唯一の欠点は、これが では機能しないことHtml.EditorForModel()です。

于 2010-07-24T03:47:51.350 に答える