Рендеринг названия поля в Editortemplate (отображается через editorfor ())
-
18-09-2019 - |
Вопрос
В настоящее время я строю администратор для веб-сайта в ASP.NET MVC.
В приложении ASP.NET MVC я начал использовать вспомогательный метод «Editorfor», как SO:
<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>
Теперь я хотел бы получить атрибут «id» «Textarea», установленный на имя поля, например:
<textarea id="Biography" class="html">
...
</textarea>
Но я не вижу способа сделать это с текущей настройкой.
Все, о чем я могу придумать, это создание «HTML» ViewModel, которая содержит свойство «значения» и свойство «ControlID».
Но если бы я основывал это представление, а не «System.xml.linq.xelement», он больше не будет совместимы с методом «редактора» для помощника, и мне придется делать все вручную.
У кого -нибудь еще была подобная проблема?
Решение
Вы должны быть в состоянии вытащить желаемый идентификатор из ViewData.templateinfo.htmlfieldprefix. Как это:
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>
<textarea id="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" class="html">
<%= Model.ToString() %>
</textarea>
Чтобы показать, почему это работает, вот место в TemplateHelpers.cs (из MVC2 Preview 1 Source), где ViewData инициализируется для управления шаблоном редактора:
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
.
Другие советы
Использовали это для генерации идентификатора (с префиксом модели). Пропустите часть .Replace (), если вы хотите атрибут имени.
<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %>
В нашем случае нам пришлось использовать Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName
с ExpressionHelper.GetExpressionText
который в Razor использовался так:
// 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"/>