【问题标题】:How do I keep field values in the ASP.NET MVC form if it has been invalidated?如果 ASP.NET MVC 表单中的字段值已失效,如何保留它?
【发布时间】:2011-03-29 21:17:51
【问题描述】:
我有一个表单在发送电子邮件之前要经过一些验证。
我尝试使用它进行验证,其中 ValidateInput 方法根据输入设置 ModelState:
[HttpPost]
public ActionResult Create(FormCollection collection)
{
ValidateInput(collection);
if (ModelState.IsValid == false) return View(collection);
如果某些内容无效,这将清除所有输入的字段。我想将所有输入的数据保留在该字段中。我该怎么做?
【问题讨论】:
标签:
c#
asp.net-mvc
validation
asp.net-mvc-2
modelstate
【解决方案1】:
您是在表单的输入字段中使用 Html 帮助程序还是常规的 html 标签?
<%: Html.TextBoxFor(x => x.Message) %> - original value will be kept
<input type="text" name="Message" /> - original value will be lost after postback
您还可以从使用内置验证(带有数据注释属性)而不是使用您自己的验证方法中受益。
【解决方案2】:
如果在这种情况下您无法更改 ValidateInput 方法以不擦除您的属性,那么您确实需要两份表单数据副本,一份传递给此方法,另一份保留在验证时传递给视图失败。
最好为动作视图使用特定的视图模型,而不是依赖 FormCollection 对象。这样您就可以使用模型绑定来检索数据。
我认为下面的代码应该可以工作,但我还没有机会测试它,所以要小心!
[HttpPost]
public ActionResult Create(MyCreateViewModel collection)
{
MyCreateViewModel myCVM = new MyCreateViewModel();
TryUpdateModel(myCVM);
ValidateInput(myCVM);
if (ModelState.IsValid == false) return View(collection);
【解决方案3】:
AFAIK 你不需要在 Create 方法中自己调用 ValidateInput - 框架已经为你设置了 ModelState,所以只需删除第一行。