Question

La possibilité de laisser le modèle gérer sa propre validation m'a conduit à commencer à jouer avec la version de prévisualisation MVC 2. Jusqu'à présent, j'aime la simplicité du système de validation. Cependant, j'ai couru dans un barrage routier. Ce style de validation fonctionne très bien pour les objets modèle simple vue. Par exemple, si j'ai un objet de modèle nommé voiture et je suis à la recherche pour créer une vue de créer une nouvelle voiture:

----- ------- Modèle

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

----- Contrôleur ---------

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");

    }

}

------- -------------- Voir

<%@ 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>

Cela fonctionne comme un charme. Mais pas tous mes points de vue, ou des objets modèles pour cette matière, sont simples. Je pourrais avoir un objet modèle de voiture comme:

----- ------- Modèle

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

------- -------------- Voir

<%@ 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>

Quand j'ajoute PaintScheme les biens immobiliers à mon avis, ils ne sont pas reportées avec l'objet « maVoiture » passé dans mon action du contrôleur. Est-il un moyen de résoudre ce sans avoir à reconstruire l'objet d'une collection de formulaire, puis vérifier la ModelState?

Était-ce utile?

La solution

  1. Vous devriez avoir des propriétés setter publique vous souhaitez être lié. Je me demande comment le premier échantillon fonctionne pour vous que tout est privé.
  2. Vous devez après au moins une valeur de la propriété PaintScheme pour pouvoir lier.
  3. Toutes les propriétés de l'enfant doit être préfixé avec le chemin pour elle. Où chemin peut être définie comme * (PropertyName.) **.

Il semble que le point 3 est pas satisfait dans la vue. Changer la partie appropriée de la vue à ceci:

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

Notez plus que j'ai retiré des valeurs explicites de l'aide TextBox pour éviter possible NullReferenceException.

Autres conseils

La meilleure façon de traiter ce problème est d'aplatir votre modèle à l'aide d'un DTO. Ensuite, utilisez la carte pour automapper votre objet de domaine à votre modèle de vue. Cette traduction peut être définie de telle sorte que vous convertissez le ENUM une chaîne et le dos. Ensuite, la validation fonctionnera et votre bom ne touche pas le point de vue de maintenir votre seperation des préoccupations assez bien.

Pour la partie de couleur que vous pouvez avoir quelque chose comme ça, étant un entier, je ne pense pas que vous allez utiliser une zone de texte, mais cela va se lier votre couleur rouge (si la valeur d'entrée est un nombre)

 <p>
                <label for="Red">Color:</label>
                <%= Html.TextBox("Red", Model.Paint.Red)%>
                <%= Html.ValidationMessage("Red") %>
 </p>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top