【问题标题】: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,所以只需删除第一行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-23
        • 1970-01-01
        • 2014-05-13
        • 1970-01-01
        相关资源
        最近更新 更多