2011-04-18 6 views
3

MVC 2アプリケーションを使用しています。欠落しているASP.Net MVCコントローラの404エラーメッセージを修正してください

しかし、現在、私は純つの低レベルを得る:「『/サイト名』アプリケーションでサーバーエラーが発生しました...」

私は素敵な404をレンダリングしますNotFound作用を有するベースコントローラを持っていますページ。

欠落アクションが処理されます。

protected override void HandleUnknownAction(string actionName) 
{ 
    this.NotFound(actionName).ExecuteResult(this.ControllerContext); 
} 

ので{site}/ValidController/NotAnActionへの訪問が正しくルーティングされます。

{site}/NotAControllerへの訪問はありません。

私はすべてのキャッチで設定ルートを持っている:

routes.MapRoute(
    "MVC routes", 
    "{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional }); 

routes.MapRoute(
    "Catch All", 
    "{*url}", 
    new { controller = "System", action = "NotFound" }); 

キャッチがすべて正しく一致しないルートをキャッチします。

したがって{site}/Invalid/Action/id/extraは、すべてを経由して正しくルーティングされます。

{site}/Invalidは「MVCルート」ルート経由で取得され、ASP.NetはInvalidControllerを探して、見つからない場合はダム例外をスローします。

私はweb.configレベルでこれを無効にすることができますが、それはページにリダイレクトされることがわかります。私はルートパターンが一致するが、コントローラは有効なコントローラ名ではないことを知りたい。

どこでこの動作を捕まえて変更できますか?

答えて

4

あなたは正規表現を使用してルートに一致するように許可されているコントローラ名を制限することができますので、私たちは、コントローラの工場のデフォルトの実装を想定した場合、我々はサポートされているすべての可能なクラス名を把握することができます:

// build up a list of known controllers, so that we don't let users hit ones that don't exist 
var allMvcControllers = 
    from t in typeof(Global).Assembly.GetTypes() 
    where t != null && 
     t.IsPublic && 
     !t.IsAbstract && 
     t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase) && 
     typeof(IController).IsAssignableFrom(t) 
    select t.Name.Substring(0, t.Name.Length - 10); 

// create a route constraint that requires the controller to be one of the reflected class names 
var controllerConstraint = new 
{ 
    controller = "(" + string.Join("|", allMvcControllers.ToArray()) + ")" 
}; 

// default MVC route 
routes.MapRoute(
    "MVC", 
    "{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional }, 
    controllerConstraint); 

// fall back route for unmatched patterns or invalid controller names 
routes.MapRoute(
    "Catch All", 
    "{*url}", 
    new { controller = "System", action = "NotFound" }); 

これは理想的ではありませんが、アプリケーションの開始時にヒットを追加し、まだ複雑すぎると感じますが、目的の効果があります。

+0

おそらく、パフォーマンス低下の問題については、Application_StartでのみcontrollerConstraintを満たすことができますか? – sasjaq

+0

これはApplication_Startにあります - .Net MVCアプリケーションの標準として。 – Keith

+0

ああ、あなたは正しいです...私のプロジェクトを開いていないかもしれません...多分別のアプローチはいくつかの属性を使用しているかもしれません...私たちはsomルートを持っています、コントローラ名と同じではないので、 "直接"... – sasjaq

0

レベルをweb.configに設定しても「ページにリダイレクトされません」。 MVCアプリでは、あなたはそれを"{controller/action}" URLを与えるANそれは実際にそのアクションを呼び出します。

<customErrors mode="On" defaultRedirect="/system/problem"> 
    <error statusCode="404" redirect="/system/notfound" /> 
</customErrors> 

これはSystemControllerNotFoundを呼び出します。

たとえば、HttpContext.Request.RawUrlの値を取得して、間違った要求の内容を確認することができます。"/system/notfound?aspxerrorpath=/Invalid"。この場合、私はInvalidControllerに行きました。

ところで、このようなことを処理するうまい方法は、ELMAH (or Error Logging Modules and Handlersを実装しています。 Scott Hanselman wrote an "introductory" post about itでも、ELMAHは現在NuGetパッケージとして利用可能です。

あなたはこの質問を見てみることをお勧めします/ ASP.NET MVCでそれを使用する方法のansers:それはまだ理想的ではないのですけれども、私は最終的には、この答えを見つけたHow to get ELMAH to work with ASP.NET MVC [HandleError] attribute?

+0

私はMVC2でそれをしないと思っています(それは3人かもしれません) - 毎回リダイレクトされます。アプリケーションにWebFormsとMVCのページが混在していて、明示的に ' Keith

関連する問題