【问题标题】:Textbox reverts to old value while Modelstate is valid on postback当 Modelstate 在回发时有效时,文本框恢复为旧值
【发布时间】:2011-06-04 16:03:47
【问题描述】:

也许我遗漏了一些东西,但是当我有一个回发到相同操作的表单时,文本框值会恢复为旧值。以下示例应在每个 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);
    }

}

【问题讨论】:

    标签: asp.net-mvc-2 binding


    【解决方案1】:

    您应该使用 Post-Redirect-Get pattern 或不使用 Html Helpers。

    参考: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】:

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

      诀窍是在返回模型之前清除模型状态

      [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);
      }
      

      更多详情请阅读这两篇文章

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

      Asp.net MVC ModelState.Clear

      【讨论】:

      • 谢谢。我知道清除 ModelState 会起作用,我只是不知道为什么必须为有效模型完成。第一个链接有 Brad Wilson 的一些 cmets 解释说这是设计使然,如果可用,视图将始终使用 ModelState,无论模型是否有效。一个也有效的解决方案是重定向到一个动作而不是返回再次查看(因为这将使用可用的 ModelState)。
      • 显然你不应该清除模型状态 - 见blogs.msdn.com/b/simonince/archive/2010/05/05/…
      猜你喜欢
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 2011-03-01
      相关资源
      最近更新 更多