validation - Asp.Net MVC2 Clientside problema de validación con controles con prefijos
asp.net-mvc-2 viewusercontrol (1)
Forma correcta de establecer los mismos prefijos tanto para el cuadro de texto como para la validación:
<% using (Html.BeginHtmlFieldPrefixScope(Model.Prefix)) { %>
<%= Html.TextBoxFor(m => m.Address.PostCode) %>
<%= Html.ValidationMessageFor(m => m.Address.PostCode) %>
<% } %>
dónde
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 - Prefijo de ViewModel
El problema es: cuando coloco 2 controles del mismo tipo en una página, debo especificar diferentes prefijos para el enlace. En este caso, las reglas de validación generadas inmediatamente después del formulario son incorrectas. Entonces, ¿cómo hacer que la validación del cliente funcione para el 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" });
%>
el control 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")
simplemente devuelve "FaxPhone.CountryCode" o "PhonePhone.CountryCode" dependiendo del 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 son 2 reglas (requeridas, 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 duplicada de Asp.Net MVC2 Clientside Validation y el problema de la identificación duplicada, pero el consejo de generar identificadores manualmente no ayuda.