2012-03-02 67 views
1

类似的问题已经被反复提出,但由于某种原因,我尝试过的东西都没有奏效。我有一个Ajax应用程序,当用户请求的网址无效,我想返回一个JsonResult看起来是这样的:ASP.NET MVC Json 404响应

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

我不希望用户只被重定向到定义错误页web.config文件将会把它们带出ajax应用程序。

我曾尝试以下的事情:

  • 定制HandleErrorAttribute - 原来这些只能处理500错误,由于我的代码
  • 定制FilterAttribute扩展FilterAttribute并实现个IExceptionFilter抛出的异常 - 同样的问题之前,
  • 覆盖基本控制器中的HandleUnknownAction - 无法弄清楚如何从方法中返回JsonResult
  • 添加了catch所有路由 - 我的其他路由在catch发现路线

任何想法将不胜感激。

+0

如果您的404是期望的,您的其他路线如何使用? – Lazarus 2012-03-02 16:55:31

+0

url/NonExistantController/NonExistantAction /仍然匹配股票路由/ {Controller}/{Action}/{id},以便在捕获{* url} – 2012-03-02 18:02:41

回答

2

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

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

更新,包括JsonRequestBehavior返回一个JsonResult - 你将需要。

对于与现有控制器或资源不匹配的请求,您有两种选择 - 将标准捕获全部路由"{controller}/{action}/{id}"丢弃并将其替换为将请求发送给固定控制器的固定控制器,该固定控制器返回此类似404的响应你要的那个。

或者使用标准的Asp.Net错误处理重定向到将执行相同操作的路由。就我个人而言,我更喜欢这个解决方案,因为这意味着您不必将全部路由加载到您的全局中。

+0

的所有路由之前使用路由。那么一个未知的控制器呢? – 2012-03-02 18:42:48

+0

@NickOlsen - 已更新我的答案;基本上要么是404默认路由的默认路由;或使用Asp.Net自定义错误响应重定向到返回此响应的控制器。如果它是IIS 7,我确信它也可以使用web.config中的IIS自定义错误来执行相同的操作。 – 2012-03-02 21:29:16

0

你可以给https://github.com/Buildstarted/Errlusion一个漩涡,并创建404的任何你想要的处理。如果它是一个Ajax请求,或者如果它是一个标准的Web浏览器请求,如果你愿意的话,你可以返回一个特殊的Ajax消息。