editortemplateでフィールド名をレンダリングする(editorfor()を介してレンダリング)
-
18-09-2019 - |
質問
現在、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.GetFullHtmlFieldName
と ExpressionHelper.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"/>