【问题标题】:ModelState.IsValid returns 400 Bad RequestModelState.IsValid 返回 400 错误请求
【发布时间】:2014-09-18 15:48:55
【问题描述】:

在 ASP.NET MVC 5 应用程序中,如果 ModelState 验证失败,以下代码应将用户返回原始视图。

将向用户显示与验证失败的输入相关的错误消息。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(DemoViewModel model)
{
    if (!ModelState.IsValid) return View(model);

    ...

    return RedirectToAction("Details");
}

但是,目前,当我的 ModelState 无效时,我会收到 400 Bad Request Error 页面:

IE

Chrome

最初,我认为这是自定义错误页面的错误配置。 为了排除这种情况,我创建了一个具有相同错误页面配置的新项目,但我无法重新创建问题。

仅供参考,这里是错误配置:

Web.config 自定义错误

<customErrors mode="On" defaultRedirect="~/500.aspx" redirectMode="ResponseRewrite">
    <error statusCode="401" redirect="~/401.aspx" />
    <error statusCode="403" redirect="~/401.aspx" />
    <error statusCode="404" redirect="~/404.aspx" />      
</customErrors>

Web.config httpErrors

<httpErrors errorMode="Custom" >
    <remove statusCode="401" />
    <error statusCode="401" path="401.html" responseMode="File" />
    <remove statusCode="403" />
    <error statusCode="403" path="401.html" responseMode="File" />
    <remove statusCode="404" />
    <error statusCode="404" path="404.html" responseMode="File"/>
    <remove statusCode="500" />
    <error statusCode="500" path="500.html" responseMode="File" />
</httpErrors>

有什么会破坏ModelState 的处理方式?

【问题讨论】:

  • 在 IF 条件下设置断点并查看代码块是否已调试。可能是您的代码无法访问
  • 是否有任何名为“编辑”的视图..????
  • @Kartikeya 是的,视图是可用的。
  • @sangramparmar if 语句上的断点被命中并且代码可以访问。

标签: c# asp.net asp.net-mvc asp.net-mvc-5


【解决方案1】:

您在控制器操作中触发了一个 GET 请求,但它需要一个 POST。这会导致错误代码 400。

您可能希望重定向到显示您要编辑的对象的编辑操作。

假设您的 ViewModel 中有一个 Id,并且您的 Edit 操作需要一个 int Id,请执行以下操作:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(DemoViewModel model)
{
    int modelId = model.Id;
    if (!ModelState.IsValid) {
       //call the Edit action which displays the item .. or details. 
       //Not an ActionResult decorated as [HttpPost]!
       return RedirectToAction("EditGetAction", new { id = modelId });
    }

    ...

    return RedirectToAction("Details");
}

【讨论】:

  • 我明白你为什么建议这样做,我会仔细检查我是否正在发送 POST。但是,我不确定重定向到 Invalid ModelSate 上的 Edit 操作。渲染视图时将不会保留无效元素。我会仔细检查我是否发出了 POST 请求。
  • 我肯定会发送POST 请求。在我看来,该方法是在BeginForm Html Helper 上使用FormMethod.Post 显式设置的。我还使用“网络”跟踪工具验证了使用 IE 和 Chrome 中的开发人员工具发送了 POST 请求。
  • 您是否与 Fiddler 或任何其他代理确认了这一点,if (!ModelState.IsValid) return View(model); 行调用 Httpverb 的哪个方法?
【解决方案2】:

我找到了问题的原因。

导致错误的页面有 2 个表单,一个仅在模式中可见,另一个是我尝试调试的主表单。 我一直误以为是主窗体导致了问题,其实是隐藏窗体要在模态中显示。

经过大量调试,我在另一个操作中发现了一行代码,而不是我认为导致问题的代码。

感谢提供建议的人。

【讨论】:

    猜你喜欢
    • 2019-07-28
    • 2019-07-11
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多