2010-05-03 13 views
5

Il problema è: quando metto 2 controlli dello stesso tipo su una pagina ho bisogno di specificare prefissi diversi per il binding. In questo caso le regole di convalida generate subito dopo il modulo non sono corrette. Così come ottenere il lavoro di convalida del client per il caso ?:Asp.Net MVC2 Clientside Problema di convalida con i comandi con prefissi

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 ViewUserControl controllo <PhoneViewModel>:

<%= 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") solo restituisce "FaxPhone.CountryCode" o "PhonePhone.CountryCode" a seconda del prefisso


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

La domanda è un po 'duplicato di Asp.Net MVC2 Clientside Validation and duplicate ID's problem ma i consigli di generare manualmente ids doesn aiuta

risposta

10

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/)

Anche l'approccio Html.EditorFor dovrebbe funzionare come suggerito qui: ASP.NET MVC 2 - ViewModel Prefix

+0

Bello. Questa risposta è stata molto utile. Vorrei poterlo alterare ancora un paio di volte. –

+0

Molto, molto utile. Grazie. – Luke

+0

So che questa è una vecchia risposta, ma mi chiedevo se il tuo metodo è preferibile per mettere questo nella tua vista: ViewData.TemplateInfo.HtmlFieldPrefix = "myViewModel.MyCustomObjdect"; –