Question

Le problème est le suivant: quand je mets 2 contrôles du même type sur une page que je dois spécifier différents préfixes pour la liaison. Dans ce cas, les règles de validation générés juste après la forme sont incorrectes. Alors, comment obtenir un travail de validation du client pour le cas:

la page contient:

<%
    Html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel { Phone = person.PhonePhone, Prefix = "PhonePhone" });
    Html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel { Phone = person.FaxPhone, Prefix = "FaxPhone" });
%>

le contrôle ViewUserControl :

<%= Html.TextBox(Model.GetPrefixed("CountryCode"), Model.Phone.CountryCode) %>
<%= Html.ValidationMessage("Phone.CountryCode", new { id = Model.GetPrefixed("CountryCode"), name = Model.GetPrefixed("CountryCode") })%>

Model.GetPrefixed("CountryCode") retourne juste "FaxPhone.CountryCode" ou "PhonePhone.CountryCode" selon le préfixe


Et voici les règles de validation générés après la forme. Ils sont dupliquées pour le nom du champ « Phone.CountryCode ». Bien que le résultat souhaité est de 2 règles (obligatoire, nombre) pour chacun des FieldNames « FaxPhone.CountryCode », « PhonePhone.CountryCode » texte alt http://www.freeimagehosting.net/uploads/37fbe720bf.png

La question est un peu en double de Asp.Net MVC2 ClientSide validation et problème de double identité de mais les conseils de générer manuellement ids ne pas aide.

Était-ce utile?

La solution

CORRECTEMENT définir les mêmes préfixes à la fois pour la validation et zone de texte:

<% using (Html.BeginHtmlFieldPrefixScope(Model.Prefix)) { %>
   <%= Html.TextBoxFor(m => m.Address.PostCode) %>
   <%= Html.ValidationMessageFor(m => m.Address.PostCode) %>
<% } %>

public static class HtmlPrefixScopeExtensions
{
    public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix)
    {
        return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix);
    }

    private class HtmlFieldPrefixScope : IDisposable
    {
        private readonly TemplateInfo templateInfo;
        private readonly string previousHtmlFieldPrefix;

        public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix)
        {
            this.templateInfo = templateInfo;

            previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix;
            templateInfo.HtmlFieldPrefix = htmlFieldPrefix;
        }

        public void Dispose()
        {
            templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix;
        }
    }
}

(par hasard trouvé la solution dans le code sur le blog de Steve Sanderson http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/ )

ressemble également à Html.EditorFor approche devrait fonctionner aussi bien comme suggéré ici: ASP. NET MVC 2 - ViewModel Prefix

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top