Подтвердить что ты не робот

Отображение имени поля в 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", и мне пришлось бы делать все вручную.

У кого-нибудь была аналогичная проблема?

4b9b3361

Ответ 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"/>