ASP.NET MVC 3 POST ModelState和ViewModel

时间:2011-05-27 16:51:54

标签: asp.net-mvc validation asp.net-mvc-3 post

在我的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属性中。但我宁愿避免这种令人讨厌的工作,所以如果有人提出任何更好的解决方案,请告诉我。

3 个答案:

答案 0 :(得分:4)

以下内容可行:

ModelState.Remove("MyProperty");
viewModel.MyProperty = "new value";

您需要将其从模型状态中删除,因为HTML帮助程序在绑定它们的值时首先会查看它。

答案 1 :(得分:0)

我所能提供的就是将@Value = Model.PropertyInViewModel添加到将在ViewModel中修改的每个Html.TextBoxFor

另一种方式,正如@Darin Dimitrov所说,将成为我自己的助手。

答案 2 :(得分:0)

如果您决定删除模型状态值以防止往返,请查看我在没有魔术字符串的情况下删除ModelState错误的RemoveFor()扩展方法。