ASP.NET MVC 2 RC验证问题

时间:2009-12-26 05:45:35

标签: asp.net-mvc validation asp.net-mvc-2

我正在尝试使用ASP.NET MVC 2(RC)的验证功能

我有一个

viewmodel

public class CategoryPageViewModel
{

            public int Id { get; set; }

            [Required(ErrorMessage="Category name required")]
            public string CategoryName { get; set; }
}

动作

    [HttpPost()]
    public ActionResult Create(CategoryPageViewModel categoryModel)
    {
        if (ModelState.IsValid)
        {
            return View("Completed");
        }
        return View(categoryModel);

    }

查看

<%= Html.ValidationSummary() %>

<% using (Html.BeginForm("Create", "Category", FormMethod.Post)) {%>

    <fieldset>
        <legend>Create new category</legend>
        <p>
            <label for="CategoryName">Category name:</label>
            <%= Html.TextBox("CategoryName") %>
            <%= Html.ValidationMessage("CategoryName", "*")%>
        </p>

        <p class="submit">
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

在提交时,它说id字段也是必需的,但我没有设置Required属性。

我做错了什么或是一个错误?这是今天26/12/09下载的RC版本。

2 个答案:

答案 0 :(得分:3)

您的Create方法正在尝试从发布的表单集合中构造新的CategoryPageViewModel

public ActionResult Create(CategoryPageViewModel categoryModel){...}

但是,由于您的表单只包含CategoryName的输入,因此您的控制器方法无法创建需要ID的新CategoryPageViewModel

您的问题有两个解决方案:

  1. Id中的CategoryPageViewModel视为@Andrew提及,可以为public int? Id { get; set; }

    Id
  2. 推荐的解决方案:将Id保持为不可为空,但在表单中将此值呈现为隐藏输入。这样您就可以保持系统ID在控制器中完好无损地查看并再次返回。

    在视图中,使用以下内容将<%= Html.Hidden("Id") %> 添加为隐藏输入:

    {{1}}

答案 1 :(得分:0)

如果您不想传递Id,请将其设为可空...即:

public class CategoryPageViewModel
{
            public int? Id { get; set; }

            [Required(ErrorMessage="Category name required")]
            public string CategoryName { get; set; }
}

或根本不包括它。您如何期望在没有ID的情况下执行任何类型的数据库更新?