2012-01-20 28 views
8

Tôi đã tạo một ứng dụng ASP.NET MVC 3 trống rỗng khác với 2 bộ điều khiển, HomeControllerOtherController.Tại sao bạn cần định tuyến cho Html.Action?

HomeController.cs trông như thế này:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Index.cshtml trông như thế này:

@Html.Action("Index", "Other") 

Và, tất nhiên, Othercontroller.cs:

public class OtherController : Controller 
{ 
    [ChildActionOnly] 
    public ActionResult Index() 
    { 
     return Content("OK!"); 
    } 
} 

Cho đến nay , thật tuyệt. Tôi chạy các ứng dụng, và nó nói với tôi tất cả mọi thứ là OK!

Bây giờ, tôi lấy mặc định RegisterRoutes từ Global.asax.cs:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 
    } 

Và tôi vò nhàu tờ nó lên, do đó không có tuyến đường phù hợp OtherController:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute("Default", "", new { controller = "Home", action = "Index" }); 
    } 

Bây giờ, khi tôi chạy trang, nó bị treo với thông báo lỗi này:

System.InvalidOperationException: No route in the route table matches the supplied values. 
Source Error: 
Line 1: @Html.Action("Index", "Other") 

Tôi đã chỉ định tên bộ điều khiển và tên hành động trong cuộc gọi đến .Action. Không có URL nào được tạo và không có yêu cầu nào được thực hiện. Tại sao định tuyến lại cần tham gia?

Trả lời

4

Tôi nghĩ rằng bài viết trên blog này sẽ giúp bạn hiểu thêm một chút:

http://blogs.charteris.com/blogs/gopalk/archive/2009/01/20/how-does-asp-net-mvc-work.aspx. Về cơ bản, định tuyến liên quan đến việc xác định bộ điều khiển nào 'cháy lên' để xử lý yêu cầu và hành động thích hợp để gọi dựa trên các tham số mà bạn đã gửi và MVCRouteHandler sử dụng các tham số đó để đưa ra quyết định. Chỉ vì bạn nói cho nó biết bộ điều khiển nào trong hành động của bạn không làm cho nó bỏ qua bảng định tuyến một cách kỳ diệu, đi thẳng đến lớp điều khiển đó và bỏ qua tất cả sự tốt đẹp khác của MVC xảy ra ở phía sau. Hãy nhớ rằng, các phương thức @HTML.Action này có thể mất rất nhiều tình trạng quá tải có thể ảnh hưởng đến tuyến đường nào trong bảng định tuyến để sử dụng (ví dụ như cấu trúc URL).

Đường dẫn MVC không phải là nội dung tĩnh và như vậy, phải được phân tích cú pháp thông qua URLRoutingModule sử dụng bảng định tuyến để quyết định phải làm gì. Vì bạn không có tuyến đường phù hợp - bạn gặp lỗi.

EDIT

Trong phê phán của tôi, tôi đã không thực sự giải quyết tuyên bố cuối cùng của bạn. Bạn nói đúng, không có URL nào được tạo nhưng một yêu cầu cho ứng dụng đã được tạo. HTML.Hành động vẫn sẽ sử dụng định tuyến để xác định bộ điều khiển, hành động, khu vực, thông số nào cần sử dụng. Tôi nghĩ rằng nó là công bằng để nói một cách đơn giản rằng nó giống như tạo ra một ActionLink và nhấp vào nó cho bạn.

+0

Thank bạn. Nó có thể giúp đưa ra một ví dụ cụ thể về tình trạng quá tải có thể ảnh hưởng đến lộ trình sử dụng. Bạn có thể nghĩ ra một điều đơn giản không? –

+1

Trong những giờ muộn ở nhà (yum, rượu vang), người đầu tiên nghĩ đến sẽ sử dụng một khu vực trong từ điển giá trị tuyến đường của bạn. Nếu không có trình xử lý định tuyến, MVC sẽ biết không gian tên nào để tìm bộ điều khiển hoặc nếu nó là một tham số cho một hành động. -> @ Html.Action ("Hành động", "Bộ điều khiển", mới {khu vực = "Quản trị viên"}). Ngoài ra, các tuyến đường được đặt tên có thể là một ví dụ khác, nơi bạn chỉ cần chuyển tên của tuyến đường và không nhất thiết cần phải vượt qua bộ điều khiển, các tham số hành động vì chúng có thể được xác định trong định nghĩa tuyến đường được đặt tên. – Tommy

0

Định tuyến đã tham gia bằng cách sử dụng Html.Action trên bộ điều khiển. Khi động cơ không thể tìm thấy "HtmlHelper" khác với một hành động của "Index" nó mặc định để thực hiện đường dẫn đó có nghĩa là đi qua định tuyến. Không có tuyến đường nào phù hợp để nó phát hiện lỗi.

InvalidOperationException The required virtual path data cannot be found.

http://msdn.microsoft.com/en-us/library/ee721266.aspx

0

Các giải pháp đối với tôi là như sau:

tôi đã có dòng sau đó đã đem lại cho tôi một lỗi:

@{Html.RenderAction("ActionName", "ControllerName");} 

Thêm một tham số thrid giải quyết được lỗi:

@{Html.RenderAction("ActionName", "ControllerName", new { area = string.Empty });} 
Các vấn đề liên quan