Отображение имени поля в 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 id="Biography" class="html">
    ...
</textarea>

Но я не вижу способа сделать это с текущими настройками.

Все, о чем я могу думать, - это создать модель представления «Html», которая содержит свойство «Значение» и свойство «ControlID».

Но если бы я основывал свое мнение на этом, а не на «System.XML.Linq.XElement», он больше не был бы совместим со вспомогательным методом «EditorFor», и мне пришлось бы делать все вручную.

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


person Jonathan    schedule 27.09.2009    source источник
comment
Только что нашел аналогичный вопрос, заданный @ nathan-taylor: stackoverflow.com/questions/1329148/   -  person Jonathan    schedule 27.09.2009
comment
Этот вопрос, похоже, не имеет к этому никакого отношения. Вы вставили неправильную ссылку?   -  person Ryan Lundy    schedule 15.02.2012


Ответы (3)


У вас должна быть возможность извлечь желаемый идентификатор из свойства 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 инициализируется для элемента управления шаблоном Editor:

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.

person Justin Grant    schedule 30.09.2009
comment
Это недопустимое решение в случае модели вложенной коллекции. В этом случае HtmlFieldPrefix возвращает collectionModel[index].{PropertyName}, но по умолчанию MVC создает идентификатор в формате collectionModel_{index}__{PropertyName}. Поэтому безопасно использовать ViewData.TemplateInfo.GetFullHtmlFieldId(string.Empty) вместо HtmlFieldPrefix - person Rajeesh; 01.04.2013

Использовали это для генерации идентификатора (с префиксом модели). Пропустите часть .Replace (), если вам нужен атрибут name.

<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %>
person Sperling    schedule 30.09.2009
comment
это тоже работает, но GetFullHtmlFieldId на самом деле не нужен - если вы посмотрите на реализацию этого метода, если его аргумент - String.Empty, он просто возвращает значение свойства HtmlFieldPrefix. - person Justin Grant; 30.09.2009

В нашем случае нам пришлось использовать 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"/>
person Maslow    schedule 08.12.2014