我迷失在这个我正在研究的MVC项目上。我还阅读了Brad Wilsons的文章。 http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html
我有这个:
public class Employee
{
[Required]
public int ID { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
}
和控制器中的这些:
public ActionResult Edit(int id)
{
var emp = GetEmployee();
return View(emp);
}
[HttpPost]
public ActionResult Edit(int id, Employee empBack)
{
var emp = GetEmployee();
if (TryUpdateModel(emp,new string[] { "LastName"})) {
Response.Write("success");
}
return View(emp);
}
public Employee GetEmployee()
{
return new Employee {
FirstName = "Tom",
LastName = "Jim",
ID = 3
};
}
我的观点如下:
<% using (Html.BeginForm()) {%>
<%= Html.ValidationSummary() %>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%= Html.LabelFor(model => model.FirstName) %>
</div>
<div class="editor-field">
<%= Html.DisplayFor(model => model.FirstName) %>
</div>
<div class="editor-label">
<%= Html.LabelFor(model => model.LastName) %>
</div>
<div class="editor-field">
<%= Html.TextBoxOrLabelFor(model => model.LastName, true)%>
<%= Html.ValidationMessageFor(model => model.LastName) %>
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>
请注意,唯一可编辑的字段是LastName。当我回发时,我回到原始员工并尝试使用 LastName属性更新它。但是我在页面上看到的是以下错误:
•FirstName字段是必需的。
据我所知,这是因为TryUpdateModel失败了。但为什么?我告诉它只更新LastName属性。
我正在使用MVC2 RTM
提前致谢。
答案 0 :(得分:3)
问题在于,当您的表单被回发后,FirstName
字段为空。问题是,由于您将Employee作为参数传递给您的操作,因此在您有机会拨打GetEmployee()
之前进行验证。你可以做以下三件事之一:
1)从[Required]
字段中删除FirstName
属性。
或
2)为此字段添加Html.HiddenFor()
,以便进行往返。像这样:
<%= Html.HiddenFor(model => model.FirstName) %>
或
3)将您的行动声明更改为:
public ActionResult Edit(int id, FormCollection form)
(3)可能就是你要找的东西。
答案 1 :(得分:0)
请记住对绑定模型要谨慎。这是一篇很棒的文章,解释了原因: http://www.codethinked.com/post/2009/01/08/ASPNET-MVC-Think-Before-You-Bind.aspx