状态和ASP.NET MVC3

时间:2011-02-28 19:46:06

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

我有一个简单的asp.net MVC 3应用程序,其页面有一个表单和一个@ Html.Hidden(“hiddenField”)。我正在通过JavaScript修改hiddenField的值,当表单根据输入提交时我可能必须返回到同一个View,但是当我这样做时,隐藏字段会预先填充来自帖子的值。

这怎么可能。据我所知,程序员完全负责使用asp.net MVC维护状态。或者Helper类是否根据请求值自动设置值?

3 个答案:

答案 0 :(得分:11)

这是因为绑定HTML帮助程序时首先使用ModelState中的值,然后在模型中使用值。因此,如果您打算修改已发布的POST控制器操作中的值,则需要将其从模型状态中删除。例如:

[HttpPost]
public ActionResult Index(MyViewModel model)
{
    ModelState.Remove("SomePropertyThatYouWantToModify");
    model.SomePropertyThatYouWantToModify = "some new value";
    return View(model);
}

现在您的@Html.HiddenFor(x => x.SomePropertyThatYouWantToModify)将呈现新值。

如果您正在使用ViewData,我的答案是完整的(但我真的希望您不是):

[HttpPost]
public ActionResult Index(FormCollection form)
{
    ModelState.Remove("SomePropertyThatYouWantToModify");
    ViewData["SomePropertyThatYouWantToModify"] = "some new value";
    return View();
}

并在您的视图中@Html.Hidden("SomePropertyThatYouWantToModify")应呈现新值。

答案 1 :(得分:0)

这可能是模型活页夹问题。如果您的@Html.Hidden("hiddenField")调用生成的隐藏字段没有模型绑定器可以识别为模型属性的名称,那么它将使用您构建模型的任何进程填充的值(假设您“重建模型并仅更新视图发布的字段。”

根据您的示例,您的模型的属性名称必须完全为hiddenField

答案 2 :(得分:0)

我认为 MVC 3 处理此问题的方法存在问题。如果我在<h3>QuestionType: @Model.QuestionType</h3>中显示我的模型值,则会显示新值。但在隐藏的领域,它具有旧的价值。 @Html.HiddenFor(m => m.QuestionType);

我没有更新旧模型值并返回它。我正在创建一个全新的模型,并在我的post方法中返回,如返回View(getNewModel())

达林上面的答案确实解决了我的问题。我只是在返回视图之前使用ModelState.Clear(),一切似乎都运行正常。