Question Rendu du nom de champ dans un EditorTemplate (rendu via EditorFor ())


Je construis actuellement le back-end Admin pour un site Web dans ASP.NET MVC.

Dans une application ASP.NET MVC, j'ai commencé à utiliser la méthode d'assistance «EditorFor» comme suit:

<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 'Biography' a été décoré avec: [UIHelper ("Html")].

J'ai une vue partielle 'Html' (sous Views / Shared / EditorTemplates):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>

<textarea class="html">
    <%= Model.ToString() %>
</textarea>

Maintenant, je voudrais que l'attribut 'ID' de la 'textarea' soit défini sur le nom du champ, comme ceci:

<textarea id="Biography" class="html">
    ...
</textarea>

Mais je ne peux pas voir un moyen de le faire avec la configuration actuelle.

Tout ce que je peux penser à créer un ViewModel "HTML" qui contient une propriété "Value" et une propriété "ControlID".

Mais si je me fonde sur cela plutôt que sur '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 déjà eu un problème similaire?


23
2017-09-27 06:17


origine


Réponses:


Vous devriez pouvoir extraire l'ID souhaité de la propriété ViewData.TemplateInfo.HtmlFieldPrefix de la vue. Comme ça:

<%@ 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 l'emplacement dans TemplateHelpers.cs (de la source MVC2 Preview 1) où ViewData est initialisé pour le contrôle de modèle 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),
    }
};

Dans l'appel ci-dessus, "expression" est initialisé (plus haut dans la pile d'appels) avec le nom de la propriété en cours de modification.

BTW, @Sperling ci-dessous a attrapé un détail que je n'avais pas compris à l'origine: si vous utilisez (ou utiliseriez) un non-défaut HtmlHelper.IdAttributeDotReplacement, alors vous voudrez remplacer les points dans le HtmlPrefix propriété avec HtmlHelper.IdAttributeDotReplacement.


37
2017-09-30 06:32



Je l'ai utilisé pour générer des identifiants (avec le préfixe du modèle). Ignorez la partie .Replace () si vous voulez l'attribut de nom.

<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %>

4
2017-09-30 13:33



Dans notre cas, nous avons dû utiliser Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName avec ExpressionHelper.GetExpressionText

qui dans le 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"/>

0
2017-12-08 14:39