在我的ASP.NET MVC 3应用程序中,我有一个页面,在提交表单后,我需要更改表单中的值。如果我在ViewModel中执行它没有任何效果,我必须使用ModelState["Field"].Value
。
事实是,当页面加载和POST后,我实际上需要在ViewModel上做很多工作。所以我有一个方法接收ViewModel并完成所有工作。但是,正如我所说,在POST之后,修改ViewModel对象是没用的。这是为什么?控制器上的方法返回View(viewModel);
。视图不应该使用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
我选择将@Value = Model.PropertyInViewModel
放在每个Html.TextBoxFor
的HTML属性中。但我宁愿避免这种令人讨厌的工作,所以如果有人提出任何更好的解决方案,请告诉我。
答案 0 :(得分:4)
以下内容可行:
ModelState.Remove("MyProperty");
viewModel.MyProperty = "new value";
您需要将其从模型状态中删除,因为HTML帮助程序在绑定它们的值时首先会查看它。
答案 1 :(得分:0)
我所能提供的就是将@Value = Model.PropertyInViewModel
添加到将在ViewModel中修改的每个Html.TextBoxFor
。
答案 2 :(得分:0)
如果您决定删除模型状态值以防止往返,请查看我在没有魔术字符串的情况下删除ModelState错误的RemoveFor()
扩展方法。