Asp.net mvc 2 Textbox恢复为旧值,而Modelstate在回发时有效

Asp.net mvc 2 Textbox恢复为旧值,而Modelstate在回发时有效,asp.net-mvc-2,binding,Asp.net Mvc 2,Binding,也许我遗漏了什么,但当我有一个表单返回到同一个操作时,textbox值会恢复为旧值。下面的示例应该增加每篇文章文本框中的值。这种情况不会发生,模型上的值会增加,并且模型是有效的 但是,如果我在HttpPost操作(代码中的注释)中清除modelstate,那么一切都会按预期工作 我错过什么了吗 代码如下: 型号: public class MyModel { public int MyData { get; set; } } <%@ Page Title="" Language=

也许我遗漏了什么,但当我有一个表单返回到同一个操作时,textbox值会恢复为旧值。下面的示例应该增加每篇文章文本框中的值。这种情况不会发生,模型上的值会增加,并且模型是有效的

但是,如果我在HttpPost操作(代码中的注释)中清除modelstate,那么一切都会按预期工作

我错过什么了吗

代码如下:

型号:

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

}
查看:

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

}

我刚刚在网上找到了答案

诀窍是在返回模型之前清除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);
}
有关更多详细信息,请阅读这两篇文章

您应该使用或不使用Html帮助程序

参考:


基本上,MVC希望post中的任何重新显示都是一个验证错误,并优先于模型数据重新使用发布的数据(查看
ModelState
)。指导是不要使用
ModelState.Clear()

谢谢。我知道清除ModelState会起作用,我只是不知道;我不知道为什么要为一个有效的模型这么做。第一个链接有Brad Wilson的一些注释,解释说这是出于设计,视图将始终使用ModelState(如果可用),而不管模型是否有效。。一个同样有效的解决方案是重定向到某个操作,而不是再次返回视图(因为该视图将使用可用的ModelState)