1

我有一个表单在发送电子邮件之前要经过一些验证。

我尝试使用它进行验证,其中 ValidateInput 方法根据输入设置 ModelState:

[HttpPost]
public ActionResult Create(FormCollection collection)
{
    ValidateInput(collection);
    if (ModelState.IsValid == false) return View(collection);

如果某些内容无效,这将清除所有输入的字段。我想将所有输入的数据保留在该字段中。我怎样才能做到这一点?

4

3 回答 3

6

您是在表单中的输入字段或常规 html 标记中使用 Html 助手吗?

<%: Html.TextBoxFor(x => x.Message) %> - original value will be kept
<input type="text" name="Message" /> - original value will be lost after postback

您还可以从使用内置验证(带有数据注释属性)而不是使用您自己的验证方法中受益。

于 2010-08-14T21:34:15.513 回答
1

AFAIK 你不需要在 Create 方法中自己调用 ValidateInput - 框架已经为你设置了 ModelState,所以只需删除第一行。

于 2010-08-14T17:36:29.250 回答
0

如果您无法更改 ValidateInput 方法以在这种情况下不擦除您的属性,那么您确实需要两份表单数据副本,一份传递给此方法,另一份保留在验证失败时传递给视图。
最好为动作视图使用特定的视图模型,而不是依赖 FormCollection 对象。这样您就可以使用模型绑定来检索数据。
我认为下面的代码应该可以工作,但我没有机会测试它,所以要小心!

[HttpPost]
public ActionResult Create(MyCreateViewModel collection)
{
    MyCreateViewModel myCVM = new MyCreateViewModel();
    TryUpdateModel(myCVM);
    ValidateInput(myCVM);
    if (ModelState.IsValid == false) return View(collection);
于 2010-08-14T17:37:41.510 回答