2010-05-03 8 views
5

El problema es: cuando pongo 2 controles del mismo tipo en una página, necesito especificar prefijos diferentes para el enlace. En este caso, las reglas de validación generadas inmediatamente después del formulario son incorrectas. Entonces, ¿cómo conseguir trabajo validación del cliente para el caso ?:Asp.Net MVC2 Clientside problema de validación con controles con prefijos

la página 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" }); 
%> 

el control de ViewUserControl <PhoneViewModel>:

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

donde Model.GetPrefixed("CountryCode") sólo devuelve "FaxPhone.CountryCode" o "PhonePhone.CountryCode" según el prefijo


Y aquí están las reglas de validación generadas después del formulario. Se duplican para el nombre de campo "Phone.CountryCode". Mientras que el resultado deseado es 2 reglas (requerido, número) para cada uno de los FieldNames "FaxPhone.CountryCode", "PhonePhone.CountryCode" alt text http://www.freeimagehosting.net/uploads/37fbe720bf.png

La pregunta es un tanto duplicado de Asp.Net MVC2 Clientside Validation and duplicate ID's problem pero el consejo para generar manualmente los identificadores doesn no ayuda.

Respuesta

10

forma correcta de establecer los mismos prefijos tanto para la caja de texto y validación:

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

donde

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

(por casualidad encontró la solución en el código en el blog de Steve Sanderson http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/)

También parece que el enfoque Html.EditorFor debería funcionar tan bien como se sugiere aquí: ASP.NET MVC 2 - ViewModel Prefix

+0

Agradable. Esta respuesta fue muy útil. Ojalá pudiera recitarlo un par de veces más. –

+0

Muy, muy útil. Gracias. – Luke

+0

Sé que esta es una respuesta antigua, pero me preguntaba si su método es preferible a poner esto en su vista: ViewData.TemplateInfo.HtmlFieldPrefix = "myViewModel.MyCustomObjdect"; –

Cuestiones relacionadas