为什么没有通过模型的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) ?

我已经调试了代码,它工作了,这意味着@Html.ValidationSummary()可以显示错误,

Your name: @Html.EditorFor(m => m.ClientName)

也会在输入框中显示ClientName。但如果我想使用@Model,它是Null。为什么返回View()没有模型可以保持错误和值在EditorFor html助手?

为什么没有通过模型的MVC3返回视图会产生验证错误

一位微软员工在他的MSDN博客上对此做了很好的解释:

ASP。. NET MVC假定,如果您正在呈现视图以响应HTTP POST,并且您正在使用Html helper,那么您最有可能重新显示验证失败的表单。因此,Html helper实际上在ModelState中检查要显示的值一个字段,然后再查看模型。这使它们能够重新显示用户输入的错误数据和匹配错误

@Html.EditorFor(m => m.ClientName)被调用时,它实际上是在模型状态中查找先前发送的值,而不是查看传递给视图的对象模型。如果模型状态中没有值,它将查看传递的对象模型。

如果您想验证这一点,只需调用:

ModelState.Clear();

在您的HttpPost行动。字段的值将变成传递给视图的对象上的属性值。在你的情况下,你不会得到一个值,因为你没有返回一个对象到你的视图。