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?

Était-ce utile?

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"/>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top