2010-08-13 23 views
5

Tôi đang cố gắng sử dụng lớp Domain Route Maarten Balliauw của để ánh xạ tên miền phụ cho các khu vực trong một ứng dụng MVC2 vì vậy mà tôi có URL như:Routing là tìm bộ điều khiển trong các lĩnh vực của tôi, nhưng không phải là quan điểm

http://admin.mydomain.com/home/index 

thay vì:

http://mydomain.com/admin/home/index 

Cho đến nay, tôi chỉ có một phần thành công. Việc thực thi đang được định tuyến đến bộ điều khiển chính xác trong vùng chính xác, nhưng sau đó nó không thể tìm thấy khung nhìn chính xác. Tôi nhận được lỗi sau:

The view 'Index' or its master was not found. The following locations were searched: 
~/Views/AdminHome/Index.aspx 
~/Views/AdminHome/Index.ascx 
~/Views/Shared/Index.aspx 
~/Views/Shared/Index.ascx 

Điều này cho tôi biết rằng MVC chỉ tìm kiếm chế độ xem trong thư mục gốc và không phải thư mục lượt xem trong Khu vực. Nếu tôi sao chép chế độ xem từ thư mục chế độ xem của Vùng vào thư mục gốc, trang sẽ hiển thị tốt. Tuy nhiên, điều này hoàn toàn đánh bại mục đích của việc chia APP thành các khu vực.

tôi xác định con đường cho khu vực này như:

public class AdminAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
     get { return "Admin"; } 
    } 

    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.Routes.Add(
      "Admin_Default" 
      , new DomainRoute(
       "admin.localhost" 
       , "{controller}/{action}/{id}" 
       , new { controller = "AdminHome", action = "Index", id = UrlParameter.Optional } 
     )); 
    } 
} 

Tôi đang bối rối là tại sao nó là tìm bộ điều khiển trong phạm vi khu vực tốt, nhưng không phải là quan điểm.

Trả lời

3

OK, tôi đã tìm ra. Sau khi tải về mã nguồn MVC 2 và thêm nó vào giải pháp của tôi như được vạch ra here, tôi đã bước qua mã MVC. Tôi thấy rằng các tuyến trong khu vực thực hiện giao diện IRouteWithArea. Giao diện này thêm thuộc tính 'Area' vào RouteData, không có gì đáng ngạc nhiên, chứa tên của khu vực. Tôi đã sửa đổi lớp DomainRoute để thực hiện giao diện này và thêm một vài nhà xây dựng quá tải lấy thông số bổ sung này và bây giờ nó hoạt động chính xác như tôi muốn.

Mã đăng ký tuyến đường của tôi bây giờ trông như thế này:

context.Routes.Add(
    "Admin_Default" 
    , new DomainRoute(
     "admin.mydomain" 
     ,"Admin" 
     , "{controller}/{action}/{id}" 
     , new { controller = "AdminHome", action = "Index", id = UrlParameter.Optional } 
     )); 
+0

+1 điều này khiến tôi bối rối trong một thời gian dài. Một khi tôi tìm thấy bộ điều khiển chính xác trong khu vực đã được nhấn, nhưng nó đưa ra quan điểm sai, tôi nhanh chóng tìm thấy câu hỏi và câu trả lời của bạn - hoạt động độc đáo. – Marijn

1

Nếu bạn có tên bộ điều khiển chia sẻ giữa khu vực của bạn và tuyến đường mặc định của bạn, và có vẻ như bạn làm, bạn có thể cần phải xác định không gian tên khi bạn gọi MapRoute.

Ví dụ, nếu namespace cấp cao nhất của ứng dụng web của bạn là Web, các RegisterRoutes phương pháp trong Global.asax.cs tập tin sẽ giống như thế này:

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}",   
    new { action = "Index", id = UrlParameter.Optional }, 
    null, 
    new string[] { "Web.Controllers" } 
); 

và sau đó là RegisterArea moethod của AdminAreaRegistration.cs sẽ giống như thế này:

context.MapRoute(
    "Admin_Default", 
    "Admin/{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional }, 
    null, 
    new string[] { "Web.Areas.Admin.Controllers" } 
); 
+0

gì về việc thêm nhiều hơn một tuyến đường? Điều gì sẽ xảy ra nếu bạn cần các tuyến đường khác với Admin_Default? Giống như những gì nếu bạn muốn các tuyến đường cho các bộ điều khiển và hành động khác bổ sung trong khu vực quản trị của bạn? Tôi chưa thấy bất kỳ ai cho thấy ví dụ về điều đó ... chỉ hiển thị các ví dụ về cách xử lý chỉ đường mặc định cho các khu vực. – PositiveGuy

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