2010-05-03 3 views
5

Le problème est le suivant: lorsque je mets 2 contrôles du même type sur une page, j'ai besoin de spécifier des préfixes différents pour la liaison. Dans ce cas, les règles de validation générées juste après le formulaire sont incorrectes. Alors, comment obtenir un travail de validation du client pour le cas ?:Asp.Net MVC2 Problème de validation côté client avec des contrôles avec des préfixes

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 ViewUserControl de contrôle <PhoneViewModel>:

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

Model.GetPrefixed("CountryCode") juste retourne "FaxPhone.CountryCode" ou "PhonePhone.CountryCode" en fonction du préfixe


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

La question est en double un peu de Asp.Net MVC2 Clientside Validation and duplicate ID's problem mais les conseils de générer manuellement ids doesn 't aide.

Répondre

10

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

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

Apparaît également comme approche Html.EditorFor devrait fonctionner aussi bien que suggéré ici: ASP.NET MVC 2 - ViewModel Prefix

+0

Nice. Cette réponse a été très utile. J'aurais aimé pouvoir l'emporter deux fois de plus. –

+0

Très, très utile. Je vous remercie. – Luke

+0

Je sais que c'est une vieille réponse, mais je me demandais si votre méthode est préférable de mettre ceci dans votre vue: ViewData.TemplateInfo.HtmlFieldPrefix = "myViewModel.MyCustomObjdect"; –

Questions connexes