查看数据字典覆盖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
对象。 这将使您免于模型绑定器和模型值生成的错误,您不知道它们来自何处。
- Asp.net Identity使用密码和Azure Active Directory身份validation
- MVC相当于Webforms“UrlAuthorizationModule.CheckUrlAccessForPrincipal”
- 如何在MVC模型中表示一个月的复选框
- 如何从ASP.NET读取条形码?
- FileStreamResult是否关闭Stream?
- 在MVCrazor回来后,maintaning下降选定状态?
- 用于列表方案的AutoMapper似乎只重复映射列表中的第一个对象
- 如何在Entity Framework中使用条件聚合sql查询?
- 使用Flags枚举时如何减少ASP.NET MVC视图中的代码重复