为什么没有传递模型的MVC3返回视图会得到验证错误

时间:2014-06-24 01:27:42

标签: c# asp.net-mvc-3 validation

我正在阅读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助手中的错误和值?

1 个答案:

答案 0 :(得分:1)

Microsoft员工实际上已在his MSDN blog上解释了这一点:

  

ASP.NET MVC假设您在渲染视图以响应   HTTP POST,你正在使用Html助手,那么你很有可能   重新显示验证失败的表单。因此,   Html Helpers实际上在ModelState中检查要显示的值   在他们查看模型之前的字段。这使他们能够重新显示   用户输入的错误数据和匹配错误   消息,如果需要。

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

如果您想验证这一点,只需致电:

ModelState.Clear();

HttpPost行动中。无论传递给视图的对象上的属性值如何,该字段的值都将变为该值。在您的情况下,由于您没有将对象返回到视图,因此您将无法获得值。