Rendu le nom de champ dans un EditorTemplate (rendu par EditorFor ())
-
18-09-2019 - |
Question
Je suis en train de construire Admin back-end pour un site Web dans ASP.NET MVC.
Dans une application ASP.NET MVC, j'ai commencé à utiliser la méthode d'aide 'EditorFor' comme ceci:
<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>
Dans le modèle, le champ 'Biographie' a été décorée avec:. [UIHelper ( "Html")]
J'ai une vue partielle 'Html' (sous Vues / Shared / EditorTemplates):
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>
<textarea class="html">
<%= Model.ToString() %>
</textarea>
Maintenant, je voudrais avoir l'attribut « ID » de la « textarea » défini sur le nom du champ, comme ceci:
<textarea id="Biography" class="html">
...
</textarea>
Mais je ne vois pas une façon de le faire avec la configuration actuelle.
Tout ce que je peux penser est la création d'un ViewModel « Html » qui contient une propriété « Value » et une propriété « ControlID ».
Mais si je l'opinion basé ce, plutôt que « System.XML.Linq.XElement », il ne serait plus compatible avec la méthode d'assistance « EditorFor » et je devrais tout faire manuellement.
Quelqu'un at-il eu un problème similaire encore?
La solution
Vous devriez pouvoir retirer l'ID souhaitée de la propriété ViewData.TemplateInfo.HtmlFieldPrefix de la vue. Comme ceci:
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>
<textarea id="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" class="html">
<%= Model.ToString() %>
</textarea>
Pour montrer pourquoi cela fonctionne, voici le lieu TemplateHelpers.cs (la source MVC2 Preview 1) où ViewData est initialisé pour le contrôle du modèle de l'éditeur:
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),
}
};
Dans l'appel ci-dessus, « expression » est initialisé (plus haut dans la pile d'appel) avec le nom de l'établissement en cours d'édition.
BTW, @Sperling ci-dessous un détail pris Au départ, je raté. Si vous utilisez (ou peut-être utiliser) un HtmlHelper.IdAttributeDotReplacement
non par défaut, vous aurez envie de remplacer les points dans la propriété HtmlPrefix
avec HtmlHelper.IdAttributeDotReplacement
Autres conseils
utilise ce pour générer id (avec préfixe modèle). Passer la partie .Replacer () si vous voulez que l'attribut name.
<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %>
Dans notre cas, nous avons dû utiliser Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName
avec ExpressionHelper.GetExpressionText
qui rasoir a été utilisé comme ceci:
// 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"/>