ModelState.Clear不起作用

The*_*Guy 5 c# asp.net-mvc asp.net-mvc-3

我有一个在MVC中构建的简单联系表单,它使用Html帮助程序类生成文本框并下拉.我想清除文本框和下拉列表的值,就像使用get渲染页面时一样(仅在查询正确提交后).

我正在使用这种方法ModelState.Clear()来执行此清理,但我的表单值仍然存在,任何关于我在这里做错了什么的想法?成功后,它会在代码中显示消息.您可以在下面找到我控制器的代码副本.

感谢您抽出宝贵的时间!

[HttpPost]
public ActionResult Contact(ContactUsViewModel model)
{
    if (ModelState.IsValid)
    {
       bool isSuccess = _siteService.CreateInquiry(model.Inquiry);

       if (isSuccess)
       {
           model.SuccessMessage = "Thank you for contacting us.";
           ModelState.Clear();
       }
    }

    model.InquiryTypes = InquiryTypes;
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 5

如果成功,只需在Post-Redirect-Get模式重定向到您的GET操作:

public ActionResult Contact()
{
    var model = new ContactUsViewModel
    {
        SuccessMessage = TempData["SuccessMessage"] as string
    };
    return View(model);
}

[HttpPost]
public ActionResult Contact(ContactUsViewModel model)
{
    if (ModelState.IsValid)
    {
       bool isSuccess = _siteService.CreateInquiry(model.Inquiry);
       if (isSuccess)
       {
           TempData["SuccessMessage"] = "Thank you for contacting us.";
           return RedirectToAction("Contact");
       }
    }

    // since you are modifying the value of the InquiryTypes property
    // you need to remove it from the modelstate to avoid getting the 
    // old value rendered by the helpers
    ModelState.Remove("InquiryTypes");
    model.InquiryTypes = InquiryTypes;
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

或者因为我不是TempData的忠实粉丝(因为它使用Session而且我个人总是在我的应用程序中禁用它),你可以简单地将查询字符串参数传递给Contact GET动作,如(success=1)并在此动作中准备成功消息.


小智 0

这是因为ModelState是 a 的属性Controller,它不是保存您提交的表单值的属性。这是您想要做的:

if (ModelState.IsValid)
{
   bool isSuccess = _siteService.CreateInquiry(model.Inquiry);

   if (isSuccess)
   {
       model = new ContactUsViewModel();  // modified line
       model.SuccessMessage = "Thank you for contacting us.";
   }
}

model.InquiryTypes = InquiryTypes;
return View(model);
Run Code Online (Sandbox Code Playgroud)

Controller.ModelState属性,正如 MSDN 所解释的:

获取包含模型状态和模型绑定验证状态的模型状态字典对象。

我在代码示例中所做的就是取出您的ModelState.Clear()方法调用并放入model = new ContactUsViewMode();. 这是清除 ViewModel 数据属性的一种随意方式。


替代工艺

您也可以这样做,并更改您的 ViewModel:

public class ContactUsViewModel()
{
    // ... all of your existing view model members

    public void Clear()
    {
        this.SomeStringProperty = string.Empty;
        this.SomeIntProperty = 0;
        // ... so on and so forth
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您只需调用Clear()现有实例即可,而不是创建 ViewModel 类的新实例:

if (ModelState.IsValid)
{
   bool isSuccess = _siteService.CreateInquiry(model.Inquiry);

   if (isSuccess)
   {
       model.Clear();  // modified line
       model.SuccessMessage = "Thank you for contacting us.";
   }
}

model.InquiryTypes = InquiryTypes;
return View(model);
Run Code Online (Sandbox Code Playgroud)

  • 事实上,你的回答有误导性。ModelState 是保存模型值的东西,并且在模型值提供者的优先级顺序中是第一位的。我很确定你的第二个(替代过程)不会工作,因为你不清除模型状态 (4认同)