Frage

Die Fähigkeit, das Modell handhabt ihre eigene Validierung zu lassen hat mich führt Spiel mit der MVC 2 Preview-Version zu beginnen. Bis jetzt, ich mag die Einfachheit des Validierungsschema. Allerdings habe ich in eine gesperrte Straße. Diese Validierung Stil funktioniert gut für einfache Ansicht Modellobjekte. Zum Beispiel, wenn ich ein Modell Objekt mit dem Namen Auto und ich suche eine Ansicht zu erstellen, ein neues Auto zu erstellen:

----- Modell -------

public class Car
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Color { get; set; }
}

----- Regler ---------

public class CarController : Controller
{
    public ActionResult Create()
    {
        Car myCar = new Car();
        return View("Create", myCar);

    }

    [HttpPost]
    public ActionResult Create(Car myCar)
    {
        if (!ModelState.IsValid)
        {
            return View("Create", myCar);
        }

        //Do something on success
        return View("Index");

    }

}

------- Ansicht --------------

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Car>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>

    <% 
        using (Html.BeginForm()) {%>

        <fieldset>
            <legend>Edit User Profile</legend>
            <p>
                <label for="Id">Id:</label>
                <%= Html.TextBox("Id", Model.Id)%>
                <%= Html.ValidationMessage("Id") %>
            </p>
            <p>
                <label for="Name">Name:</label>
                <%= Html.TextBox("Name", Model.Name)%>
                <%= Html.ValidationMessage("Name") %>
            </p>
            <p>
                <label for="Color">Color:</label>
                <%= Html.TextBox("Color", Model.Color)%>
                <%= Html.ValidationMessage("Color") %>
            </p>

            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>

    <% } %>

</asp:Content>

Das funktioniert wie ein Charme. Aber nicht alle meine Ansichten oder Modellobjekte für diese Angelegenheit, sind einfach. Ich könnte ein Automodell haben Objekt wie:

----- Modell -------

public class PaintScheme
{
    public int Red { get; set; }
    public int Blue { get; set; }
    public int Green { get; set; }
}

public class Car
{
    public string Id { get; set; }
    public string Name { get; set; }
    public PaintScheme Paint{ get; set; }
}

------- Ansicht --------------

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Car>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>

    <% 
        using (Html.BeginForm()) {%>

        <fieldset>
            <legend>Edit User Profile</legend>
            <p>
                <label for="Id">Id:</label>
                <%= Html.TextBox("Id", Model.Id)%>
                <%= Html.ValidationMessage("Id") %>
            </p>
            <p>
                <label for="Name">Name:</label>
                <%= Html.TextBox("Name", Model.Name)%>
                <%= Html.ValidationMessage("Name") %>
            </p>
            <p>
                <label for="Red">Color Red:</label>
                <%= Html.TextBox("Red", Model.Paint.Red)%>
                <%= Html.ValidationMessage("Red") %>
            </p>
            <p>
                <label for="Blue">Color Blue:</label>
                <%= Html.TextBox("Blue", Model.Paint.Blue)%>
                <%= Html.ValidationMessage("Blue") %>
            </p>
            <p>
                <label for="Green">Color Green:</label>
                <%= Html.TextBox("Green", Model.Paint.Green)%>
                <%= Html.ValidationMessage("Green") %>
            </p>

            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>

    <% } %>

</asp:Content>

Wenn ich die PaintScheme Eigenschaften meiner Sicht hinzufügen, werden sie nicht mit dem „myCar“ Objekt übergeben in mein Controller-Aktion übernommen. Gibt es eine Möglichkeit, dies zu lösen, ohne dass das Objekt aus einer Form Sammlung neu zu erstellen und dann die Überprüfung des Model?

War es hilfreich?

Lösung

  1. sollten Sie haben die public Setter für Eigenschaften, die Sie gebunden werden soll. Ich frage mich, wie die erste Probe für Sie arbeitet als alles privat ist.
  2. Sie müssen post mindestens einen Wert von PaintScheme Eigenschaft der Lage sein, es zu binden.
  3. Alle Kinder Eigenschaften sollten mit dem Pfad , um es vorangestellt werden. Wo Pfad können als * (Propertyname.) Definiert werden **.

Es scheint, die Nummer 3 in der Ansicht nicht erfüllt ist. Ändern Sie den entsprechenden Teil der Blick auf diese:

        <p>
            <label for="Red">Color Red:</label>
            <%= Html.TextBox("Paint.Red")%>
            <%= Html.ValidationMessage("Red") %>
        </p>
        <p>
            <label for="Blue">Color Blue:</label>
            <%= Html.TextBox("Paint.Blue")%>
            <%= Html.ValidationMessage("Blue") %>
        </p>
        <p>
            <label for="Green">Color Green:</label>
            <%= Html.TextBox("Paint.Green")%>
            <%= Html.ValidationMessage("Green") %>
        </p>

Darüber hinaus beachten Sie, dass ich explizite Werte aus dem TextBox Helfer entfernt möglich Nullreferenceexception zu vermeiden.

Andere Tipps

Der einfachste Weg, um damit umzugehen ist Ihr Modell zu glätten eine dto verwenden. Dann nutzen AutoMapper auf Ihre Domain-Objekt zu Ihrer Ansicht Modell abzubilden. Diese Übersetzung könnte in einer solchen Art und Weise definiert werden, dass Sie die Enum in eine Zeichenfolge und zurück konvertieren. Dann wird die Validierung arbeiten und Ihre bom nicht die Ansicht berühren Ihre Trennung von Bedenken Aufrechterhaltung ziemlich gut.

Für den Farbteil können Sie so etwas wie dies haben, ein int sein Ich glaube nicht, dass Sie ein Textfeld verwenden, aber dies wird Ihre rote Farbe binden (wenn der Eingangswert ist eine Zahl)

 <p>
                <label for="Red">Color:</label>
                <%= Html.TextBox("Red", Model.Paint.Red)%>
                <%= Html.ValidationMessage("Red") %>
 </p>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top