2011-01-28 2 views
6

Я понимаю, как настроить собственные маршруты, но как обрабатывать маршруты, которые попадают в трещины таблицы маршрутизации? Я имею в виду, я предполагаю, что маршрут по умолчанию {controller}/{action}/{id} может быть общим обловом, но я не уверен, что это путь. Мне нравится позволять моим пользователям знать, что они запросили данные/«страница», которая не существует.Обработка ошибок маршрута в ASP.NET MVC

Входит ли фильтр [HandleError]? Как это работает?

ответ

7

Если Ваш маршрут не найден, вы хотите обработать его как обычную ошибку HTTP 404.

Если вы добавляете только атрибут [HandleError] к вашему классу или действию, MVC будет искать вид Error в вашей папке видов.

Вы также можете добавить ErrorController или даже статические страницы и добавить к вашему Web.config:

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

Или вы могли бы обрабатывать HTTP 404 в вашем Global.asax.cs и маршрут к ErrorController программно. Вот как я обычно это сделать:

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" } 
       ); 

чем сделать действие в контроллере вроде этого:

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

Этот маршрут sould будет добавлен последний, таким образом он будет ловить любой запрос которые не могут быть отображены.

HandleError Атрибут используется для обнаружения исключений, которые могут возникать в действиях контроллера.

+0

Проблема с этим подходом является то, что .. если вы пытаетесь оказать ребенку действие @ Html.Action (routeValues) с неправильными значениями, оно будет оказывать действие 'PageNotFound' как' PartialView' без фактического представления каких-либо исключений. – Nenad

Смежные вопросы