Рендеринг названия поля в Editortemplate (отображается через editorfor ())

StackOverflow https://stackoverflow.com/questions/1482925

Вопрос

В настоящее время я строю администратор для веб-сайта в 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"/>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top