为什么没有通过模型的MVC3返回视图会产生验证错误
本文关键字:视图 错误 验证 返回 MVC3 模型 为什么 | 更新日期: 2023-09-27 18:10:04
我正在阅读Pro Asp。Net mvc框架和有一个混淆的问题,它不大,但我想它里面一定有一些很深的东西可以学习。非常简单的代码
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
无效,返回视图显示错误,为什么使用返回View()
,但不返回View(appt)
?
我已经调试了代码,它工作了,这意味着 Your name: @Html.EditorFor(m => m.ClientName)@Html.ValidationSummary()
可以显示错误,
也会在输入框中显示ClientName
。但如果我想使用@Model
,它是Null。为什么返回View()
没有模型可以保持错误和值在EditorFor
html助手?
一位微软员工在他的MSDN博客上对此做了很好的解释:
ASP。. NET MVC假定,如果您正在呈现视图以响应HTTP POST,并且您正在使用Html helper,那么您最有可能重新显示验证失败的表单。因此,Html helper实际上在ModelState中检查要显示的值一个字段,然后再查看模型。这使它们能够重新显示用户输入的错误数据和匹配错误
当@Html.EditorFor(m => m.ClientName)
被调用时,它实际上是在模型状态中查找先前发送的值,而不是查看传递给视图的对象模型。如果模型状态中没有值,它将查看传递的对象模型。
如果您想验证这一点,只需调用:
ModelState.Clear();
在您的HttpPost
行动。字段的值将变成传递给视图的对象上的属性值。在你的情况下,你不会得到一个值,因为你没有返回一个对象到你的视图。