【问题标题】:ASP.NET MVC Json 404 ResponseASP.NET MVC Json 404 响应
【发布时间】:2012-03-21 04:27:11
【问题描述】:

类似的问题被问了一遍又一遍,但出于某种原因,我尝试过的所有方法都没有奏效。我有一个 ajax 应用程序,当用户请求一个无效的 url 时,我想返回一个看起来像这样的 JsonResult:

[ error: true, status: 404, message: 'The requested page could not be found... or some other message... ']

我不希望用户被重定向到 web.config 文件中定义的错误页面,因为这会将他们带出 ajax 应用程序。

我尝试了以下方法:

  • 自定义 HandleErrorAttribute - 由于我的代码引发的异常,这些仅处理 500 个错误
  • 扩展 FilterAttribute 并实现 IExceptionFilter 的自定义 FilterAttribute - 与以前相同的问题
  • 在基本控制器中覆盖 HandleUnknownAction - 无法确定如何从该方法返回 JsonResult
  • 添加了一条 catch all 路线 - 在找到 catch all 路线之前,我的其他路线正在使用中

任何想法都将不胜感激。

【问题讨论】:

  • 如果您期望的是 404,您的其他路线如何使用?
  • url /NonExistantController/NonExistantAction/ 仍然匹配 stock 路由 /{Controller}/{Action}/{id} 以便在 {*url} 的 catch all 路由之前使用路由

标签: asp.net-mvc json http-status-code-404


【解决方案1】:

•在基本控制器中覆盖 HandleUnknownAction - 无法弄清楚如何从方法中返回 JsonResult

new JsonResult() 
  { 
    Data = your_404_data,
    JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
  }.ExecuteResult(ControllerContext);

已更新以包含您需要的 JsonRequestBehavior。

对于与现有控制器或资源不匹配的请求,您有两个选择 - 放弃标准的包罗万象的路由 "{controller}/{action}/{id}" 并将其替换为将请求发送到返回此 404 的固定控制器你想要的回应。

或者使用标准的 Asp.Net 错误处理来重定向到将做同样事情的路由。我个人更喜欢这种解决方案,因为这意味着您不必将大量路由编码到全局中。

【讨论】:

  • 效果很好。一个未知的控制器呢?
  • @NickOlsen - 更新了我的答案;基本上要么放弃404包罗万象的默认路由;或使用 Asp.Net 自定义错误响应重定向到返回此响应的控制器。如果是 IIS 7,我确定是,你也可以使用 web.config 中的 IIS 自定义错误来做同样的事情。
【解决方案2】:

您可以试一试https://github.com/Buildstarted/Errlusion 并为 404 创建任何您想要的处理方式。如果它是一个 ajax 请求,您可以返回一个特殊的 ajax 消息,或者如果它是一个标准的 Web 浏览器请求,则返回 html。

【讨论】:

    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2020-12-02
    • 2014-02-25
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多