2011-01-28 43 views
6

Tôi hiểu cách thiết lập tuyến đường của riêng mình, nhưng cách xử lý tuyến đường rơi qua các vết nứt của bảng định tuyến? Ý tôi là, tôi đoán tuyến đường mặc định là {controller}/{action}/{id} có thể là điểm bắt đầu chung, nhưng tôi không chắc đó có phải là con đường để đi hay không. Tôi muốn cho phép người dùng của mình biết họ đã yêu cầu dữ liệu/một 'trang' không tồn tại.Xử lý lỗi tuyến đường trong ASP.NET MVC

Đây có phải là bộ lọc [HandleError] không? Làm thế nào mà làm việc một cách chính xác?

Trả lời

7

Nếu không tìm thấy tuyến đường của bạn, bạn muốn xử lý nó như một lỗi HTTP 404 bình thường.

Nếu bạn chỉ thêm thuộc tính [HandleError] vào lớp học hoặc hành động của mình, MVC sẽ tìm kiếm chế độ xem Error trong thư mục chế độ xem của bạn.

Bạn cũng có thể thêm một hoặc thậm chí là một trang tĩnh ErrorController và thêm video này vào Web.config của bạn:

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

Hoặc bạn có thể xử lý các HTTP 404 trong Global.asax.cs của bạn và tuyến đường đến một ErrorController lập trình. Đó là cách tôi thường làm điều đó:

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

Bạn có thể xác định một lộ trình như thế này:

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

Thân làm một hành động trong một bộ điều khiển như thế này:

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

Tuyến đường này Linh hồn được thêm vào cuối cùng, cách mà nó sẽ bắt bất kỳ yêu cầu không thể được ánh xạ.

HandleError thuộc tính được sử dụng để bắt ngoại lệ có thể xảy ra trong hành động của bộ điều khiển.

+0

Cách tiếp cận này là .. nếu bạn cố gắng hiển thị hành động con @ Html.Action (routeValues) với giá trị sai, nó sẽ trả về hành động 'PageNotFound' là' PartialView' mà không thực sự báo cáo bất kỳ ngoại lệ nào. – Nenad

Các vấn đề liên quan