我正在阅读Pro Asp.Net MVC3框架并且有一个混乱的问题,它并不大,但我认为它必须有一些内在的东西可以学习。非常简单的代码
public class AppointmentController : Controller
{
private IAppointmentRepository repository;
public AppointmentController(IAppointmentRepository repo)
{
repository = repo;
}
public ViewResult MakeBooking()
{
return View(new Appointment {Date = DateTime.Now});
}
[HttpPost]
public ViewResult MakeBooking(Appointment appt)
{
if (string.IsNullOrEmpty(appt.ClientName))
{
ModelState.AddModelError("ClientName", "Please enter your name");
}
if (ModelState.IsValidField("Date") && DateTime.Now > appt.Date)
{
ModelState.AddModelError("Date", "Please enter a date in the future");
}
if (!appt.TermsAccepted)
{
ModelState.AddModelError("TermsAccepted", "You must accept the terms");
}
if (ModelState.IsValidField("ClientName") && ModelState.IsValidField("Date")
&& appt.ClientName == "Joe" && appt.Date.DayOfWeek == DayOfWeek.Monday)
{
ModelState.AddModelError("", "Joe cannot book appointments on Mondays");
}
if (ModelState.IsValid)
{
repository.SaveAppointment(appt);
return View("Completed", appt);
}
**else
{
return View();
}**
}
}
所以我的问题是:ModelState
无效并返回到视图以显示错误,为什么使用return View()
,但不返回View(appt)
?
我调试了代码,它有效,这意味着@Html.ValidationSummary()
可以显示错误,
Your name: @Html.EditorFor(m => m.ClientName)
ClientName
。但如果我想使用@Model
,则为空。
为什么在没有模型的情况下返回View()
可以保存EditorFor
html助手中的错误和值?
答案 0 :(得分:1)
Microsoft员工实际上已在his MSDN blog上解释了这一点:
ASP.NET MVC假设您在渲染视图以响应 HTTP POST,你正在使用Html助手,那么你很有可能 重新显示验证失败的表单。因此, Html Helpers实际上在ModelState中检查要显示的值 在他们查看模型之前的字段。这使他们能够重新显示 用户输入的错误数据和匹配错误 消息,如果需要。
当调用@Html.EditorFor(m => m.ClientName)
时,它实际上在模型状态内查找先前发送的值,而不是查看传递给视图的对象模型。如果模型状态中没有值,它将查看传递的对象模型。
如果您想验证这一点,只需致电:
ModelState.Clear();
在HttpPost
行动中。无论传递给视图的对象上的属性值如何,该字段的值都将变为该值。在您的情况下,由于您没有将对象返回到视图,因此您将无法获得值。