2017-07-19 13 views
1

私はここ(How to make custom error pages work in ASP.NET MVC 4)またはhttp://benfoster.io/blog/aspnet-mvc-custom-error-pagesここに見つけた可能性のあるすべての方法を試みました:http://www.secretgeek.net/custom_errors_mvcしかし、それは私のために働いているようです。ASP MVC 4でカスタムエラーを有効にする方法はありますか?

私はそれをミニムに簡略化しましたが、存在しないページに当たったときでも醜い標準エラーメッセージが表示されます。

マイError.cshtmlがビューに配置された共有フォルダを\、それは次のようになります。

<div> 
    <span>Error occurred</span> 
</div> 

も試してみました:

@model System.Web.Mvc.HandleErrorInfo 
@{ 
    ViewBag.Title = "Parking & Ticket Scan Information - Error"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 
<div> 
    <span>Error occurred</span> 
</div> 

を私のweb.configファイルが含まれています

<customErrors mode="On" defaultRedirect="~/Error"> 
    <error redirect="~/Error/NotFound" statusCode="404" /> 
</customErrors> 

私も試しました:

<customErrors mode="On" defaultRedirect="~/Error"> 
</customErrors> 

私のErrorControllerの様である:

ルート:

public class ErrorController : Controller 
{ 
    [HandleError] 
    public ViewResult Index() 
    { 
     return View(); 
    } 
} 

([のHandleError]属性を伴うまたは伴わない、

public ViewResult NotFound() 
{ 
    Response.StatusCode = 404; //you may want to set this to 200 
    return View("NotFound"); 
} 

後、私は、Global.asaxのにルーティングも添加してそしてなし.MapRoute( 名前: "PageNotFound"、 URL: "{* url}"、 デフォルト:new {controller = "Error"、action = "Index"、id = Ur lParameter.Optional}

IISにカスタムエラーを表示させるものはありません。他に何をしようとしましたか?もちろん、filters.Add(新しいHandleErrorAttribute())をコメントアウトしました。 Error.cshtmlをViewsフォルダに移動しました。

有効にするために使用できる他の方法はありますか?

+0

私はBen Fosterのソリューションを試してみました。私が試した他の解決策のいくつかは、IISが最初にエラーを傍受した場合には機能しません。その場合、あなたのアプリケーションはエラーを処理せず、デフォルトのものを見るでしょう。 – Jasen

答えて

0

あなたは、常にこの

public class HandleUnauthorizedAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     base.OnException(filterContext); 

     if (filterContext.Exception.GetType() != typeof (SecurityException)) return; 

     var controllerName = (string) filterContext.RouteData.Values["controller"]; 
     var actionName = (string) filterContext.RouteData.Values["action"]; 
     var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName); 

     filterContext.Result = new ViewResult 
     { 
      ViewName = "Unauthorized", 
      ViewData = new ViewDataDictionary<HandleErrorInfo>(model), 
      TempData = filterContext.Controller.TempData 
     }; 
     filterContext.ExceptionHandled = true; 
     filterContext.HttpContext.Response.Clear(); 
     filterContext.HttpContext.Response.StatusCode = 403; 
     filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
    } 
} 

ような何かを行うことができますこのコードは、人口HandleErrorInfoでカスタムエラーページに、すべてのSecurityExceptionsとルートをキャプチャします。

トラップして他のカスタムエラーページにルーティングする例外を除いて、常に別のフィルタを作成できます。

その後、だから私は、これまでに見つかった唯一の可能な解決策は、対応するビューを追加することでしたスタートアップ

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleUnauthorizedAttribute()); 
     //more filters if you define them. 
    } 
} 

でフィルターを登録し、/共有/閲覧に

0

をあなたのビュー(複数可)を作成しますErrorController のアクションメソッド名は、View \ Errorフォルダ内にあります。この小さな小さなディテールは他のすべてのガイドにはないようです。

ここで私はErrorContollerを持っています。CS:ビューで

public class ErrorController : Controller 
{ 
    public ActionResult ErrorDefault() 
    { 
     return View(); 
    } 
} 

そしてErrorDefault.cshtml \エラーフォルダ:

@{ 
    ViewBag.Title = "ErrorDefault"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>ErrorDefault</h2> 

そしてweb.configファイル:

<customErrors mode="On" defaultRedirect="~/Error/ErrorDefault"> 
</customErrors> 

あなたはに対応するサブフォルダにあなたのビューを置くことを忘れてしまった場合コントローラ名はMVC 4.0では動作しません。

RouteConfigに別のルートを追加する必要はありません。

私は誰かがこれを見つけることを望みます。 :)

+0

"コントローラ名に対応するサブフォルダ内にビューを置くことを忘れた場合、MVCでは機能しません" - これは常にこの方法でした。 –

関連する問題