我的视图中有一个隐藏的字段,如下所示:
using (Html.BeginForm("Action", "Schedule"))
{
@Html.Hidden("Id", Model.Schedule.Id)
...
}
一个接受这样信息的动作方法:
public ActionResult AddEventToSchedule(Event NewEvent, Guid Id)
{
// Do something
}
即使Model.Schedule.Id不为空,我也会继续传入空的Guid。我检查了html源代码,隐藏字段也是一个空的Guid(使用断点来验证Model.Schedule.Id不为空)。
奇怪的是,当我尝试通过下面的模型访问Id值时,使用guid正确填充了html隐藏字段,但传递给action方法的模型为空。
public ActionResult AddEventToSchedule(Event NewEvent, ScheduleModel model)
{
// model.Schedule is null!
}
答案 0 :(得分:13)
借助这个问题想出来: MVC3 Model Binding - List to Hidden fields
显然,HTML帮助程序在检查Model之前检查ModelState的值。 当我将Id作为参数添加到action方法时,我才看到这种行为的原因是,这调用了模型绑定器以使用Id填充ModelState。并且Id始终是空Guid的原因是因为这是第一次调用action方法时的值。
我在行动方法中添加了这一行,现在一切正常:
ModelState.Remove("Id")