2012-03-02 28 views
1

同様の質問が何度も繰り返し尋ねられましたが、何らかの理由で私が試したことはありませんでした。私は、Ajaxアプリケーションを持っており、ユーザの要求が無効なURLが、私はこのような何かに見える化する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 - これらのみによる私のコードFilterAttributeを拡張し、IExceptionFilterを実装
  • カスタムFilterAttributeによってスローされた例外に500エラーを処理判明 - 前と同じ問題を
  • ベースコントローラーのHandleUnknownActionをオーバーライドする - メソッドからJsonResultを返す方法を特定できませんでした
  • キャッチオールルートを追加 - キャッチする前に他のルートが使用されていますあなたのルートが見つかりました

いずれかの考えがあります。ベースコントローラでオーバーライドHandleUnknownAction•

+0

あなたが期待している404なら、他のルートはどのように使用できますか? – Lazarus

+0

URL/NonExistantController/NonExistantAction /は、{* url} –

答えて

2

- あなたが必要とする - 方法JsonRequestBehaviorを含むように更新

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

からするJsonResultを返す方法を見つけ出すことができませんでした。

既存のコントローラーまたはリソースと一致しない要求の場合は、標準キャッチオールルート"{controller}/{action}/{id}"を削除し、この404のような応答を返す固定コントローラーに要求を送信するものに置き換えますあなたがしたいこと。

標準のAsp.Netエラー処理を使用して、同じことを行うルートにリダイレクトします。個人的に私はあなたがあなたのグローバルにルートのロードをコード化する必要がないことを意味するので、このソリューションを好む。

+0

のすべての経路をキャッチする前に経路が使用されるように、//Controller/{Action}/{Action}しかし、未知のコントローラはどうですか? –

+0

@NickOlsen - 私の答えを更新しました。基本的に404キャッチオールのデフォルトルートを破棄するか、またはこの応答を返すコントローラにリダイレクトするAsp.Netカスタムエラー応答を使用します。 IIS 7であれば、web.configのIISカスタムエラーを使用して同じことを行うこともできます。 –

0

https://github.com/Buildstarted/Errlusionにwhirlを指定して、404に必要な処理を作成することができます.Ajaxリクエストの場合は特別なajaxメッセージを返すか、必要な場合は標準のWebブラウザリクエストの場合はHTMLを返します。