2011-01-28 5 views
6

내 경로를 설정하는 방법을 알고 있지만 라우팅 테이블의 균열을 통과하는 경로는 어떻게 처리합니까? 내 말은, 기본 {controller}/{action}/{id} 경로가 일반적인 catchall이 될 수 있다고 생각하지만, 그 방법이 있는지 확실하지 않습니다. 나는 사용자들에게 그들이 존재하지 않는 데이터/페이지를 요청했다는 것을 알려주고 싶다.ASP.NET MVC의 경로 오류 처리

여기에 [HandleError] 필터가 들어 있습니까? 정확히 어떻게 작동합니까?

답변

7

경로를 찾을 수없는 경우 정상적인 HTTP 404 오류로 처리하고 싶습니다.

클래스 또는 작업에만 [HandleError] 속성을 추가하는 경우 MVC는 views 폴더에서 Error보기를 검색합니다.

당신은 또한 ErrorController 심지어 정적 페이지를 추가하고 Web.config이를 추가 할 수

<customErrors mode="On" > 
    <error statusCode="404" redirect="/Error/PageNotFound/" /> 
</customErrors> 

을 또는 당신은 당신의 Global.asax.cs 및 경로 프로그래밍 ErrorController에있는 HTTP 404을 처리 할 수 ​​있습니다. 그건 내가 일반적으로 그것을 할 방법 :

이 방법
protected void Application_Error(object sender, EventArgs e) 
{ 
    var ex = Server.GetLastError().GetBaseException(); 

    var routeData = new RouteData(); 

    if (ex.GetType() == typeof(HttpException)) 
    { 
     var httpException = (HttpException)ex; 

     switch (httpException.GetHttpCode()) 
     { 
      case 404: 
       routeData.Values.Add("action", "PageNotFound"); 
       break; 
      default: 
       routeData.Values.Add("action", "GeneralError"); 
       break; 
     } 
    } 
    else 
    { 
     routeData.Values.Add("action", "GeneralError"); 
    } 

    routeData.Values.Add("controller", "Error"); 
    routeData.Values.Add("error", ex); 

    IController errorController = new ErrorController(); 
    errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 
} 
4

당신은이 같은 경로를 정의 할 수 있습니다 :이 같은 컨트롤러에서 작업하기보다

routes.MapRoute(
       "PageNotFound", 
       "{*catchall}", 
       new { controller = "Home", action = "PageNotFound" } 
       ); 

:이 경로는 마지막으로 추가 할 수 sould

 public ActionResult PageNotFound() 
     { 
      ViewBag.Message = "Sorry, the page you requested does not exist."; 
      return View(); 
     } 

를, 그것은 모든 요청을 잡을 것입니다 그런 식으로 매핑 할 수 없습니다.

HandleError 속성은 컨트롤러 작업 내에서 발생할 수있는 예외를 catch하는 데 사용됩니다.

+0

문제는 잘못된 값으로 자식 액션 @의 Html.Action (routeValues)를 렌더링하려고하면, 그것은'PartialView''로 PageNotFound' 조치를 렌더링 ...이다 예외를 실제로보고하지 않아도됩니다. – Nenad