Asp.net mvc 2 Textbox恢复为旧值,而Modelstate在回发时有效
也许我遗漏了什么,但当我有一个表单返回到同一个操作时,textbox值会恢复为旧值。下面的示例应该增加每篇文章文本框中的值。这种情况不会发生,模型上的值会增加,并且模型是有效的 但是,如果我在HttpPost操作(代码中的注释)中清除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=
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)