2012-03-02 68 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消息。