查看数据字典覆盖ASP.NET MVC中的模型数据

我有一个创建用户的视图,如下所示。

 

单击“创建”按钮时,HTML表单将发布到名为“SaveUser”的操作,该操作仅接受“POST”动词,如下所示。

 [AcceptVerbs(HttpVerbs.Post)] public ActionResult SaveUser( UserViewModel user) { //user.Id is zero before save //Save the user. Code omitted... //user.Id is now greater than zero //redirect to edit user view return View("EditUser", user ); } 

保存用户后,页面将重定向到“EditUser”视图

 

这是问题所在:隐藏字段的值保持显示为零。 Model.Id大于零。 似乎其他东西覆盖了模型视图值。 ViewDataDictonary是个嫌疑人。 因此,在返回操作中的视图之前添加一行,如下所示。

 [AcceptVerbs(HttpVerbs.Post)] public ActionResult SaveUser( UserViewModel user) { //user.Id is zero before save //Save the user. Code omitted... //user.Id is now greater than zero //clear the view data ViewData = new ViewDataDictionary(); //redirect to edit user view return View( "EditUser", user); } 

果然,这很有效。 隐藏字段现在具有正确用户ID的值。

我们找到了一种治疗症状的方法,但问题的根源在哪里?

我不喜欢每次在返回另一个视图之前清除视图数据字典的想法。

操作成功后,您应该使用

 return RedirectToAction("EditUser", new { id = user.Id }); 

或类似的代码。 当前ModelState用于生成视图,模型绑定器未绑定Id。

[Bind(Exclude = "Id")]也可以工作,但重定向会创建新页面(不使用当前的ModelState),这是一个更好的解决方案。

编辑:

如果您不想绑定整个对象,则应使用[Bind (Exclude)]或者您应该将SaveUser定义为SaveUser(string userName, string password)UserViewModel构建UserViewModel对象。 这将使您免于模型绑定器和模型值生成的错误,您不知道它们来自何处。