我有一个简单的asp.net MVC 3应用程序,页面有一个窗体和@ Html.Hidden(“hiddenField”)。我通过JavaScript修改hiddenField的值,当表单根据输入提交时我可能不得不返回到相同的视图,但是当我执行隐藏的字段时,会预先填充帖子中的值。状态和ASP.NET MVC3
这怎么可能。我的理解是程序员完全负责用asp.net MVC维护状态。或者Helper类自动设置请求值的值基础?
我有一个简单的asp.net MVC 3应用程序,页面有一个窗体和@ Html.Hidden(“hiddenField”)。我通过JavaScript修改hiddenField的值,当表单根据输入提交时我可能不得不返回到相同的视图,但是当我执行隐藏的字段时,会预先填充帖子中的值。状态和ASP.NET MVC3
这怎么可能。我的理解是程序员完全负责用asp.net MVC维护状态。或者Helper类自动设置请求值的值基础?
这是因为绑定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")
应该呈现的新的价值。
花了3小时试图找出动作返回查看()为什么它不在我的例子工作,从中取出ModelState.Clear(),我知道这是有原因的:) – 2011-08-12 09:28:43
这可能是一个模型绑定器问题。如果您的@Html.Hidden("hiddenField")
调用生成的隐藏字段没有模型联编程序可以识别为您的模型属性的名称,那么将使用由构建模型的任何进程填充的值(假设您正在构建模型,只更新您的视图发布的字段)。
根据您的示例,您的模型的属性名称必须完全为hiddenField
。
我认为在如何处理这个问题上存在一个问题。如果我在<h3>QuestionType: @Model.QuestionType</h3>
中显示我的模型值,它会显示新值。但在隐藏领域它具有旧价值。 @Html.HiddenFor(m => m.QuestionType);
我不更新旧的模型值并返回它。我创建了一个全新的模式和返回,在我的帖子方法回报View(getNewModel())
上述Darin的回答确实解决了我的问题。在返回视图之前我只使用ModelState.Clear()
,并且一切似乎都正常。
提交时显然会将隐藏字段保存到数据库(如果您正确构建了应用程序,这是预期的行为)。然后,当您返回到相同的视图时,视图会预填充数据库中以前的值。 – 2011-02-28 19:47:45
这里没有数据库保存,我没有返回到默认视图。我是从一个处理HttpPost – 2011-02-28 23:25:26