问题 当模型状态在回发时有效时,文本框将恢复为旧值


也许我错过了一些东西但是当我有一个回复相同动作的表单时,文本框值会恢复为旧值。以下示例应增加每个POST上文本框中的值。这不会发生,模型上的值会增加并且模型有效。

但是,如果我清除了HttpPost Action中的模型状态(代码中的注释),一切都按预期工作。

我错过了什么吗?

这是代码:

模型:

public class MyModel
{
    public int MyData { get; set; }
}

视图:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.MyModel>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm()) {%>
    <%: Html.TextBoxFor(m => m.MyData)%>   (<%: Model.MyData%>)
                  <%: Html.ValidationMessageFor(m => m.MyData) %> <br />
    State :<%: ViewData["State"] %> <br />
    <input type="submit" />
<% } %>
</asp:Content>

控制器:

public class HomeController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        return View(new MyModel { MyData = 0 });
    }

    [HttpPost]
    public ActionResult Index(MyModel myModel)
    {
        // ModelState.Clear();
        ViewData["State"] = "invalid";
        if (ModelState.IsValid)
            ViewData["State"] = "Valid";

        var model = new MyModel { MyData = myModel.MyData + 1 };
        return View(model);
    }

}

4399
2018-01-06 13:41


起源



答案:


我刚刚在网上找到了答案。

诀窍是在返回Model之前清除ModelState

[HttpPost]
public ActionResult Index(MyModel myModel)
{
    // ModelState.Clear();
    ViewData["State"] = "invalid";
    if (ModelState.IsValid)
        ViewData["State"] = "Valid";

    var model = new MyModel { MyData = myModel.MyData + 1 };

    ModelState.Clear();

    return View(model);
}

有关详细信息,请阅读这2篇文章

http://forums.asp.net/p/1527149/3687407.aspx

Asp.net MVC ModelState.Clear


8
2018-01-17 22:53



谢谢。我知道清除ModelState会起作用,我只是不知道为什么必须为有效模型完成它。第一个链接有一些评论由Brad Wilson解释说这是设计,视图将始终使用ModelState(如果可用),无论模型是否有效。一个解决方案也可以重定向到一个动作而不是返回再次查看(因为它将使用可用的ModelState)。 - John Landheer
非常感谢!帮助我了..工作很棒.. - Aaron
显然你不应该清除模型状态 - 请参阅 blogs.msdn.com/b/simonince/archive/2010/05/05/... - Tim Abell


答案:


我刚刚在网上找到了答案。

诀窍是在返回Model之前清除ModelState

[HttpPost]
public ActionResult Index(MyModel myModel)
{
    // ModelState.Clear();
    ViewData["State"] = "invalid";
    if (ModelState.IsValid)
        ViewData["State"] = "Valid";

    var model = new MyModel { MyData = myModel.MyData + 1 };

    ModelState.Clear();

    return View(model);
}

有关详细信息,请阅读这2篇文章

http://forums.asp.net/p/1527149/3687407.aspx

Asp.net MVC ModelState.Clear


8
2018-01-17 22:53



谢谢。我知道清除ModelState会起作用,我只是不知道为什么必须为有效模型完成它。第一个链接有一些评论由Brad Wilson解释说这是设计,视图将始终使用ModelState(如果可用),无论模型是否有效。一个解决方案也可以重定向到一个动作而不是返回再次查看(因为它将使用可用的ModelState)。 - John Landheer
非常感谢!帮助我了..工作很棒.. - Aaron
显然你不应该清除模型状态 - 请参阅 blogs.msdn.com/b/simonince/archive/2010/05/05/... - Tim Abell


你应该使用 重定向后 - 获取模式 或不使用Html助手。

参考: http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx

基本上MVC期望来自帖子的任何重新显示都是验证错误,并重新使用发布的数据(视图 ModelState)用于重新显示而不是模型数据。指导是  使用 ModelState.Clear()


2
2018-02-17 10:23