我正在尝试使用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版本。
答案 0 :(得分:3)
您的Create方法正在尝试从发布的表单集合中构造新的CategoryPageViewModel
。
public ActionResult Create(CategoryPageViewModel categoryModel){...}
但是,由于您的表单只包含CategoryName
的输入,因此您的控制器方法无法创建需要ID的新CategoryPageViewModel
。
您的问题有两个解决方案:
将Id
中的CategoryPageViewModel
视为@Andrew提及,可以为public int? Id { get; set; }
。
Id
推荐的解决方案:将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的情况下执行任何类型的数据库更新?