6

我在 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; }
}
4

4 回答 4

8

ModelState如果要在 post/get 中修改它,则需要从 中删除该值:

[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

于 2012-06-11T19:15:01.680 回答
3

这是设计使然。MVC 假设您希望在处理发布操作时显示用户最初提交的内容。请参阅此相关的堆栈溢出帖子

于 2012-06-11T19:15:41.603 回答
0

只是一个小编辑...用于刷新整个模型

[HttpPost]
public ViewResult EditUserData(UserData model)
{
   UserData newmodel = new UserData();
   ModelState.Clear();
   model = newmodel;
   return View("~/Views/UserDetails.cshtml", model);    
}
于 2015-05-20T09:25:08.340 回答
0

为单个字段更新 ModelState(在回发时,视图使用此集合,而不是传递的模型)具有更简单的解决方法。这是我刚刚在返回相同视图之前更新特定字段的操作:

var newVal = new ValueProviderResult("updated value", "updated value", CultureInfo.InvariantCulture);
ModelState.SetModelValue("MyFieldName", newVal);

根据您使用的 .NET/MVC 版本,ModelStateDictionary.SetModelValue()具有其他更简单的重载。

于 2019-08-15T23:23:18.633 回答