editortemplateでフィールド名をレンダリングする(editorfor()を介してレンダリング)

StackOverflow https://stackoverflow.com/questions/1482925

質問

現在、ASP.NET MVCのWebサイトの管理者バックエンドを構築しています。

ASP.NET MVCアプリケーションでは、次のような「EditorFor」ヘルパーメソッドを使用し始めました。

<div id="content-edit" class="data-form">
    <p>
        <%= Html.LabelFor(c => c.Title) %>
        <%= Html.TextBoxFor(c => c.Title)%>
    </p>
    <p>
        <%= Html.LabelFor(c => c.Biography) %>
        <%= Html.EditorFor(c => c. Biography)%>
    </p>
</div>

モデルでは、「伝記」フィールドは[uihelper( "html")]で装飾されています。

「HTML」部分ビュー(ビューの下/共有/編集/編集)があります。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>

<textarea class="html">
    <%= Model.ToString() %>
</textarea>

次に、このようなフィールドの名前に「Textarea」の「ID」属性を設定したいと思います。

<textarea id="Biography" class="html">
    ...
</textarea>

しかし、現在のセットアップでそれを行う方法がわかりません。

私が考えることができるのは、「価値」プロパティと「ControlID」プロパティを含む「HTML」ViewModelを作成することです。

しかし、「system.xml.linq.xelement」ではなく、それを見解に基づいている場合、「editorfor」ヘルパーメソッドと互換性がなくなり、すべてを手動で行う必要があります。

誰かがもう似た問題を抱えていましたか?

役に立ちましたか?

解決

ビューのViewData.templateInfo.htmlfieldPrefixプロパティから目的のIDを引き出すことができるはずです。このような:

<%@ Control Language="C#"
      Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>
<textarea id="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" class="html">
    <%= Model.ToString() %>
</textarea>

これが機能する理由を示すために、Editor Template Control用にViewDataが初期化されているTemplateHelpers.cs(MVC2 Preview 1 Source)の場所が次のとおりです。

ViewDataDictionary viewData = new ViewDataDictionary(html.ViewDataContainer.ViewData) {
    Model = modelValue,
    TemplateInfo = new TemplateInfo {
        FormattedModelValue = formattedModelValue,
        ModelType = modelType,
        HtmlFieldPrefix = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(expression),
        IsNullableValueType = (underlyingNullableType != null),
    }
};

上記のコールでは、「式」が編集されているプロパティの名前が初期化されています(コールスタックのさらに上に)。

ところで、以下の@sperlingが私が最初に見逃した詳細をキャッチしました:あなたが非デフォルトを使用している(または使用するかもしれない)場合 HtmlHelper.IdAttributeDotReplacement, 、次に、のドットを交換する必要があります HtmlPrefix とのプロパティ HtmlHelper.IdAttributeDotReplacement.

他のヒント

これを使用してIDを生成しています(モデルプレフィックス付き)。名前属性が必要な場合は、.replace()パーツをスキップします。

<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %>

私たちの場合、使用する必要がありました Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldNameExpressionHelper.GetExpressionText

かみそりでこのように使用されていました:

           // hiddenFor was caching the value of this html input, and the value alone, nothing else on the page!
            Expression<Func<Web.ViewModels.ApiSettingsViewModel, int>> expression = (m => m.OrgApiLoginCredentials[i].OrgApiLoginId); 
        }
        <input type="hidden" value="@Model.OrgApiLoginCredentials[i].OrgApiLoginId" name="@Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression))" class="data-org-api-login-id"/>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top