5 Stimmen

Asp.Net MVC2 Clientside Validation Problem mit Steuerelementen mit Präfixen

Das Problem ist: Wenn ich 2 Steuerelemente desselben Typs auf einer Seite einfüge, muss ich unterschiedliche Präfixe für die Bindung angeben. In diesem Fall sind die Validierungsregeln generiert direkt nach dem Formular falsch. Also, wie man Client-Validierung Arbeit für den Fall zu bekommen?:

die Seite enthält:

<%
    Html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel { Phone = person.PhonePhone, Prefix = "PhonePhone" });
    Html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel { Phone = person.FaxPhone, Prefix = "FaxPhone" });
%>

das Steuerelement 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") gibt nur "FaxPhone.CountryCode" oder "PhonePhone.CountryCode" zurück, je nach Präfix


Und hier sind die Validierungsregeln, die nach dem Formular generiert werden. Sie werden für den Feldnamen "Phone.CountryCode" dupliziert. Während das gewünschte Ergebnis 2 Regeln (erforderlich, Zahl) für jeden der Feldnamen "FaxPhone.CountryCode", "PhonePhone.CountryCode" ist Alt-Text http://www.freeimagehosting.net/uploads/37fbe720bf.png

Die Frage ist eine Art Duplikat von Asp.Net MVC2 Clientside Validierung und doppelte ID's Problem aber der Rat, die IDs manuell zu generieren, ist nicht hilfreich.

10voto

Sasha Punkte 1343

Korrekter Weg, um die gleichen Präfixe für Textfeld und Validierung zu setzen:

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

(zufällig fand ich die Lösung im Code im Blog von Steve Sanderson http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/ )

Auch sieht aus wie Html.EditorFor Ansatz sollte so gut funktionieren, wie hier vorgeschlagen: ASP.NET MVC 2 - ViewModel-Präfix

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X