我有一个简单的asp.net MVC 3应用程序,其页面有一个表单和一个@ Html.Hidden(“hiddenField”)。我正在通过JavaScript修改hiddenField的值,当表单根据输入提交时我可能必须返回到同一个View,但是当我这样做时,隐藏字段会预先填充来自帖子的值。
这怎么可能。据我所知,程序员完全负责使用asp.net MVC维护状态。或者Helper类是否根据请求值自动设置值?
答案 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()
,一切似乎都运行正常。