也许我错过了一些东西但是当我有一个回复相同动作的表单时,文本框值会恢复为旧值。以下示例应在每个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);
}
}
答案 0 :(得分:8)
我刚刚在网上找到了答案。
诀窍是在返回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);
}
有关详细信息,请阅读这两篇文章
答案 1 :(得分:2)
您应该使用Post-Redirect-Get pattern或不使用Html助手。
基本上,MVC希望来自帖子的任何重新显示都是验证错误,并重新使用发布的数据(查看ModelState
)进行重新显示,而不是模型数据。该指南是不使用ModelState.Clear()
。