Отображение имени поля в EditorTemplate (визуализируется через EditorFor())
В настоящее время я создаю админ-сервер для веб-сайта в ASP.NET MVC.
В приложении 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" (в разделе Views/Shared/EditorTemplates):
<%@ 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", он больше не был бы совместим с вспомогательным методом "EditorFor", и мне пришлось бы делать все вручную.
У кого-нибудь была аналогичная проблема?
Ответы
Ответ 1
Вы должны иметь возможность вытаскивать желаемый идентификатор из свойства 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), где 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),
}
};
В приведенном выше вызове "выражение" инициализируется (далее вверх по стеку вызовов) с именем редактируемого свойства.
BTW, @Sperling внизу поймал деталь, которую я изначально пропустил: если вы используете (или можете использовать) нестандартный HtmlHelper.IdAttributeDotReplacement
, то вы захотите заменить точки в свойстве HtmlPrefix
на HtmlHelper.IdAttributeDotReplacement
.
Ответ 2
Использовали это для генерации id (с префиксом модели). Пропустите часть .Replace(), если
вам нужен атрибут name.
<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %>
Ответ 3
В нашем случае нам пришлось использовать 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"/>