如何解决ASP.NET MVC 3 POST ModelState和ViewModel
|| 在我的ASP.NET MVC 3应用程序中,我有一个页面,在该页面提交表单后,我需要从表单中更改一个值。如果我在ViewModel中执行此操作无效,则必须使用ModelState[\"Field\"].Value
进行操作。
问题是,在页面加载后和POST之后,实际上我必须在ViewModel上做很多工作。因此,我有一个方法可以接收ViewModel并完成所有工作。但是,正如我所说,在POST之后,修改ViewModel对象是没有用的。这是为什么?控制器上的方法返回“ 1”。视图不应该使用ViewModel值吗?
我想了解为什么修改ViewModel没用,并且还知道ModelState中是否有某些方法“刷新”字段值会抛出ViewModel对象。
这是我的控制器代码:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(MyViewModel viewModel)
{
try
{
if (ModelState.IsValid)
//Do stuff and redirect
}
catch(Exception ex)
{
//Log and add error to the ModelState
}
someMethodWhichDoesALotOfThingsInTheViewModel(viewModel);
return View(viewModel);
}
我认为剩下的代码是不必要的,如果有人认为这将有助于让我知道!
更新资料
我不想丢失任何错误,即使是在ViewModel中更改的字段也不会丢失。一个很好的例子是验证码,如果用户在表格中犯了任何错误(仅使用验证码字段或仅使用任何其他字段而不使用验证码),我想向他展示他的所有错误并更新验证码。插入旧的验证码值来呈现表单是没有意义的,因此我想将该字段空白。
更新2
我选择在每个“ 4”的HTML属性中添加“ 3”。但是我宁愿避免这种讨厌的工作,因此,如果有人提出更好的解决方案,请告诉我。
解决方法
以下将起作用:
ModelState.Remove(\"MyProperty\");
viewModel.MyProperty = \"new value\";
您需要将其从模型状态中删除,因为HTML助手在绑定其值时首先在该状态中查找。
, 我能想到的就是在每个要在ViewModel中修改的Html.TextBoxFor
中添加@Value = Model.PropertyInViewModel
。
就像@Darin Dimitrov所说的那样,另一种方法是自己做帮手。
, 如果您决定删除modelstate值以防止往返,请看一下我为去除ModelState错误而没有魔术字符串的RemoveFor()
扩展方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。