我对MVC 3项目中的观点有一个奇怪的问题。我有一个标准的数据编辑视图(使用模板创建)。当我提交表单时,我更改了Name
属性,但是当我从控制器返回浏览器后,我仍然看到lorem
值。为什么?
@using (Html.BeginForm())
{
@Html.EditorFor(model => model.Name)
<input type="submit" value="Save" />
}
public ViewResult EditUserData(int id)
{
[...]
UserData model = new UserData();
model.Name = "lorem";
return View("~/Views/UserDetails.cshtml", model);
}
[HttpPost]
public ViewResult EditUserData(UserData model)
{
model.Name = "ipsum";
return View("~/Views/UserDetails.cshtml", model);
}
public class ControlUserData
{
[...]
[Required]
[Display(ResourceType = typeof(Resources), Name = "UserNameFirst")]
public string Name { get; set; }
}
答案 0 :(得分:7)
如果你想在帖子/ get中修改它,你需要删除ModelState
中的值:
[HttpPost]
public ViewResult EditUserData(UserData model)
{
ModelState.Remove("Name");
model.Name = "ipsum";
return View("~/Views/UserDetails.cshtml", model);
}
这是内置的MVC行为:所有Html.Helpers
都优先考虑ModelState
集合中的值而非实际模型值。
这里有一篇很好的文章:ASP.NET MVC Postbacks and HtmlHelper Controls ignoring Model Changes。
答案 1 :(得分:3)
这是设计的。 MVC假设您想要显示用户在处理帖子操作时最初提交的内容。请参阅this related stack overflow post。
答案 2 :(得分:0)
只是一个小编辑......用于刷新整个模型
[HttpPost]
public ViewResult EditUserData(UserData model)
{
UserData newmodel = new UserData();
ModelState.Clear();
model = newmodel;
return View("~/Views/UserDetails.cshtml", model);
}
答案 3 :(得分:0)
为单个字段更新ModelState(在回发时,View使用此集合,而不是传递的模型)具有更简单的解决方法。返回到同一视图之前,我只是在更新特定字段时做过以下事情:
var newVal = new ValueProviderResult("updated value", "updated value", CultureInfo.InvariantCulture);
ModelState.SetModelValue("MyFieldName", newVal);
根据您使用的.NET / MVC的版本,ModelStateDictionary.SetModelValue()还有其他更简单的重载。