Pregunta

El problema es: cuando pongo 2 controles del mismo tipo en una página necesito especificar diferentes prefijos para la unión. En este caso, las reglas de validación generados justo después de la forma son incorrectos. Entonces, ¿cómo conseguir trabajo validación del cliente para el caso:?

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

<%= 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" en función de prefijo


Y aquí es las reglas de validación generados después de la forma. Ellos se duplican para el nombre del campo "Phone.CountryCode". Mientras que el resultado deseado es 2 reglas (requerido, número) para cada uno de la FieldNames "FaxPhone.CountryCode", "PhonePhone.CountryCode" texto alternativo http://www.freeimagehosting.net/uploads/37fbe720bf.png

La pregunta es algo duplicado de Asp.Net MVC2 ClientSide validación y duplicado de identificación de problemas pero el consejo para generar identificadores de forma manual no ayuda.

¿Fue útil?

Solución

forma correcta de establecer los mismos prefijos tanto para cuadro 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 como se ve Html.EditorFor enfoque debería funcionar tan bien como se sugiere aquí: ASP. NET MVC 2 - ViewModel Prefijo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top