Domanda

Il problema è: quando ho messo 2 controlli dello stesso tipo su una pagina ho bisogno di specificare diversi prefissi per il legame. In questo caso le regole di convalida generate subito dopo la forma non sono corretti. Così come ottenere il lavoro di convalida del client per il caso:?

La pagina contiene:

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

il controllo ViewUserControl :

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

dove Model.GetPrefixed("CountryCode") restituisce solo "FaxPhone.CountryCode" o "PhonePhone.CountryCode" a seconda del prefisso


Ed ecco le regole di validazione generate dopo il modulo. Essi sono duplicati per il nome del campo "Phone.CountryCode". Mentre il risultato desiderato è 2 regole (richiesto, numero) per ciascuna delle FieldNames "FaxPhone.CountryCode", "PhonePhone.CountryCode" alt text http://www.freeimagehosting.net/uploads/37fbe720bf.png

La questione è un po 'duplicato di Asp.Net MVC2 Clientside convalida e di ID duplicato problema ma i consigli per generare manualmente gli ID non aiuta.

È stato utile?

Soluzione

modo corretto di impostare gli stessi prefissi sia per testo e la validazione:

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

dove

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;
        }
    }
}

(per caso trovato la soluzione nel codice sul blog di Steve Sanderson http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/ )

Sembra anche Html.EditorFor approccio dovrebbe funzionare così come suggerito qui: ASP. NET MVC 2 - ViewModel Prefisso

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top