2

让模型处理自己的验证的能力使我开始使用 MVC 2 预览版。到目前为止,我喜欢验证方案的简单性。然而,我遇到了障碍。这种验证风格适用于简单的视图模型对象。例如,如果我有一个名为car的模型对象,并且我希望创建一个视图来创建一辆新车:

- - -模型 - - - -

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

- - -控制器 - - - - -

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

    }

}

- - - -看法 - - - - - - -

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

这就像一个魅力。但并不是我所有的观点或模型对象都是简单的。我可能有一个汽车模型对象,例如:

- - -模型 - - - -

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

- - - -看法 - - - - - - -

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

当我将PaintScheme属性添加到我的视图时,它们不会与传递给我的控制器操作的“myCar”对象一起使用。有没有办法解决这个问题,而不必从表单集合中重建对象然后检查 ModelState?

4

3 回答 3

1
  1. 您应该拥有要绑定的属性的公共设置器。我想知道第一个示例如何为您工作,因为一切都是私人的。
  2. 您必须发布至少一个PaintScheme 属性值才能绑定它。
  3. 所有子属性都应该以它的路径为前缀。其中路径可以定义为 *(PropertyName.)**。

View 中似乎不满足第 3 点。将视图的适当部分更改为:

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

另外请注意,我从 TextBox 帮助程序中删除了显式值以避免可能的 NullReferenceException。

于 2009-09-02T02:20:46.847 回答
1

处理这个问题的最简单方法是使用 dto 展平模型。然后使用 automapper 将您的域对象映射到您的视图模型。可以通过将枚举转换为字符串并返回的方式定义此转换。然后验证将起作用,并且您的 bom 不会触及保持您的关注点分离相当好的视图。

于 2009-09-02T03:00:21.540 回答
0

对于颜色部分,你可以有这样的东西,作为一个 int 我不认为你会使用一个文本框,但这会绑定你的红色(如果输入值是一个数字)

 <p>
                <label for="Red">Color:</label>
                <%= Html.TextBox("Red", Model.Paint.Red)%>
                <%= Html.ValidationMessage("Red") %>
 </p>
于 2009-09-02T02:48:40.203 回答