2010-02-26 32 views
14

Tôi có một ứng dụng hiện có lớn được xây dựng trên ASP.NET MVC2 RC2.Cách chỉ định Vùng mặc định mà không thêm vùng = "" vào mỗi ActionLink

Tất cả các liên kết của tôi trông như thế này: htp // site/controller/action/id

Tôi chỉ cần thêm một khu vực gọi là: BigBird.

Bây giờ khi tôi đang ở khu vực BigBird, tất cả các liên kết của tôi trông như thế này: htp: // site/BigBird/controller/action/id

Vấn đề là không ai trong số những bộ điều khiển/hành động tồn tại trong Khu vực mới của tôi. Vì vậy, tôi phải đi qua tất cả các hành động của tôi trên tất cả các ứng dụng của tôi và đặt routevalue này: area = string.empty

Có cách nào xung quanh vấn đề này không?

Trả lời

12

tôi không biết đi xung quanh nó nếu bạn đang sử dụng các phương pháp MVC tiêu chuẩn (trừ có lẽ trọng họ gọi riêng của bạn phiên bản), nhưng nếu bạn đang sử dụng ActionLink<TController> hoặc các phương pháp chung khác được cung cấp trong lib MvcFutures thì bạn có thể.

Phương pháp MvcFutures gọi ExpressionHelper.GetRouteValuesFromExpression(), tìm kiếm ActionLinkAreaAttribute trên bộ điều khiển để xác định khu vực. Vì vậy, bạn có thể trang trí các bộ điều khiển của bạn trong "khu vực" chính của bạn như sau:

[ActionLinkArea("")] 
[HandleError] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Các liên kết hành động nên được tạo ra một cách chính xác bằng cách sử dụng cú pháp tiêu chuẩn:

<%= Html.ActionLink<HomeController>(c => c.Index(), "Home") %> 
+0

Cảm ơn câu trả lời. Đây là chính xác những gì tôi đã kết thúc nhưng tôi đã không quay trở lại để đăng nó. – iamwill

+0

Haha ở đây tôi đã thêm một Html.AreaActionLink ngu ngốc ... sau đó tôi thấy RouteValueDictionary GetRouteValuesFromExpression và tự hỏi ActionLinkAreaAttribute này là gì! Google nó và hạ cánh ở đây tốt công việc: P – superlogical

+0

Xin chào, nhưng khi chúng tôi sử dụng Thuộc tính khu vực này - [ActionLinkArea ("")] và cố gắng sử dụng Html.BuildUrlFromExpression (x => Index()), chúng tôi vẫn nhận được htp: // site/Vùng BigBird/bộ điều khiển/hành động/id trong URL ... –

0

Bạn có thể thực hiện một trong hai điều. Bạn có thể di chuyển/sao chép bộ điều khiển/hành động của bạn vào khu vực thích hợp hoặc viết một số bộ điều khiển mới cho khu vực mới (đó là phương pháp tôi khuyên dùng), hoặc bạn có thể viết tuyến tùy chỉnh buộc vùng mới vào thư mục gốc (mà tôi tôi không khuyến khích, vì nó đánh bại toàn bộ mục đích của việc có khu vực):

routes.MapRoute(
    "BigBird_Override",            
    "BigBird/{controller}/{action}/{id}",       
    new { area = String.Empty } 
); 
+1

lời giải thích của tôi là không phải là rất rõ ràng. Tôi đã thêm bộ điều khiển/mô hình/lượt xem BigBird của tôi vào khu vực BigBird. Nhưng trang chủ bao gồm cả Khu vực và trang web chính, hiển thị BigBird trong tất cả các liên kết quay lại trang web chính. Vì vậy, có vẻ như tôi cần làm là thêm {Area = ""} vào tất cả các cuộc gọi ActionLink của tôi. Từ những gì tôi có thể nói trong nguồn MVC là nó xâm nhập Khu vực dựa trên khu vực bạn đang ở. Nó không xác định rằng một bộ điều khiển không có trong một khu vực, và có thêm không chính xác BigBird cho các liên kết mà aren ' t trong Khu vực BigBird ... họ không ở trong bất kỳ Khu vực nào cả. – iamwill

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