2010-08-04 29 views
8

UPDATE 2UrlHelper.Action không lập bản đồ đến khu vực mà bộ điều khiển là trong một cách chính xác

Ok - Vì vậy, nó trông giống như câu hỏi của tôi đang thay đổi một lần nữa một chút :-)

Tôi đã nhận ra bây giờ mà UrlHelper.Action dường như không giải quyết chính xác URL trong bất kỳ Khu vực nào trừ khi tên khu vực được chỉ định rõ ràng. Nếu nó không được chỉ định, nó dường như trả về bất kỳ tên vùng nào mà chúng ta đang làm, nó trông giống như nó đang hoạt động từ một phần của trang web, nhưng sau đó cùng một liên kết trong một khu vực khác sẽ giải quyết nhầm tên Area.

Hoặc tôi đã làm điều gì đó sôi nổi để làm cho nó làm điều này hoặc tôi không hoàn toàn hiểu cách thức phương pháp hành động này có nghĩa là để làm việc.

UPDATE 1

tôi có thể làm cho công việc này bằng cách làm như sau:

return helper.Action("add", "product",new {area = "storemanagement"}); 

làm thay đổi câu hỏi của tôi một chút.

Cách định tuyến MVC không làm ảnh hưởng đến bộ điều khiển có cùng tên và giải quyết cho bộ điều khiển bằng phương thức hành động được chỉ định?

Origional gửi

Hey mọi người,

tôi đã tạo ra một phương pháp helper trên lớp UrlHelper và đang gặp một vấn đề nhỏ với một trong những tuyến đường.

Dưới đây là các mã cho phương thức helper trong câu hỏi:

public static string AddProduct(this UrlHelper helper) 
     { 
      return helper.Action("add", "product"); 
     } 

tôi về cơ bản có hai bộ điều khiển có tên là "sản phẩm" mà là ở các khu vực khác nhau của trang web. Một trong số chúng được sử dụng để duyệt các sản phẩm và một cho quản lý sản phẩm. Chỉ một trong các bộ điều khiển sản phẩm chứa một phương thức hành động "Thêm".

Khi tôi ra giá trị của addProduct

<%: Url.AddProduct() %> 

Tên khu vực đã được giải quyết với diện tích hiện tại tôi đang duyệt và không phải là khu vực chính xác cho bộ điều khiển sản phẩm có chứa các phương thức Add hành động.

Có điều gì tôi cần thiết lập trong các tuyến đường không? Tôi không chính xác chắc chắn như thế nào định tuyến làm việc với UrlHelper.Action vì vậy tôi dunno nếu nó có thể làm những gì tôi đang cố gắng.

Chúc mừng mọi trợ giúp.

+1

thử thêm bộ điều khiển và khu vực tên là đối số bổ sung bằng phương pháp này sig 'UrlHelper.Action Method (String, String, Object)' – Ahmad

+0

Cảm ơn Ahmad. Điều đó thực sự làm việc vì vậy tôi sẽ thêm nó như là một bản cập nhật cho câu hỏi của tôi. Tôi vẫn quan tâm đến lý do tại sao hệ thống định tuyến không phân biệt hai bộ điều khiển và thay vào đó dường như chỉ bỏ cuộc và giả sử sử dụng khu vực hiện tại. –

+0

để trả lời câu hỏi của bạn, một trong những nhu cầu đào sâu trong nội bộ của khuôn khổ MVC để tìm hiểu lý do tại sao điều này xảy ra. Trong mọi trường hợp, từ những gì tôi đã thấy chỉ có các toán tử 'controller' và' action' có điều trị đặc biệt tức là khu vực được suy ra/giả định dựa trên nơi bạn gọi người trợ giúp. Vì vậy cần phải xác định tham số vùng. – Ahmad

Trả lời

1

Đó là hành vi mặc định của Định tuyến ASP.NET.

Khi ở trong "Khu vực", hành động (và chế độ xem) được tìm kiếm bởi bộ điều khiển và tên hành động ở các vị trí mặc định. Chế độ xem được coi là ActionName trừ khi được nêu khác trong hành động, ví dụ:return PartialView("_MyPartialView.cshtml", ViewModel)

Các vị trí mặc định là những: {Controller} = tên điều khiển, {Diện tích} = tên khu vực

Bộ điều khiển:

"Areas/{Area}/{Controller}/" 
"Controllers/{Controller}" 

Xem:

"Areas/{Area}/Views/{Controller}/" 
"Areas/{Area}/Views/Shared/" 
"Views/Shared" 

Nếu bạn don' t cung cấp cho các khu vực trong các giá trị tuyến đường nó sẽ không bao giờ tìm kiếm bên ngoài các địa điểm này. Khu vực này giống với địa điểm nơi bạn đang gọi người trợ giúp của mình. Nếu bạn đang ở cấp độ gốc (không phải trong một khu vực) nó sẽ được giới hạn

"Controllers/{Controller}" // controller 
"Views/{Controller}/" // views 
"Views/Shared" // views 

Vấn đề là khi bạn ở đâu trong một Area1 nó tìm kiếm "Areas/Area1/{Controller}/" và khi bạn đang ở trong Area2 nó đã tìm kiếm "Areas/Area2/{Controller}/" (Và cả hai đã tìm kiếm Controllers/ProductControllers/Shared). Nó đã có thể tìm thấy nó khi bạn ở đâu trong khu vực bên phải bởi vì nó phù hợp với vị trí tìm kiếm mặc định, nhưng không phải trong khi ở khu vực khác bởi vì bộ điều khiển chỉ trong một khu vực vật lý.

Thêm khu vực như bạn đã làm, yêu cầu khu vực đó tìm kiếm trong Khu vực được xác định trước để nó sẽ đi thẳng đến đó. "Areas/Storemanagement/Views/product/" và tìm kiếm chế độ xem được xác định trong Thêm hành động.

Có rất ít điểm trong việc có phương thức trợ giúp trống rỗng trả về phương thức Url.Action, nhưng có lẽ đó chỉ là để trình diễn.

(Tôi chỉ nhận thấy câu hỏi là khá cũ nhưng tôi đoán điều này có thể vào đây để tham khảo sau này)

1

Chỉ cần để đưa ra câu trả lời trong phần câu trả lời cho rõ ràng ...

Bạn sẽ cần để thêm Area vào RouteValues bất cứ khi nào bạn sử dụng UrlHelper.Action để tạo đường dẫn liên kết.

Nếu bạn đang ở trong điều khiển, bạn có thể stub a UrlHelper như thế này:

var httpContext = new HttpContextWrapper(System.Web.HttpContext.Current); 
var requestContext = new RequestContext(httpContext, new RouteData()); 
var urlHelper = new UrlHelper(requestContext); 

Bạn có thể luôn get the current area như thế này:

HttpContext.Current.Request.RequestContext.RouteData.DataTokens["area"] 

Cuối cùng, khi sử dụng UrlHelperpass the area in the RouteValues object như thế này:

var url = urlHelper.Action("Index", "Home", new { area = "Pages" })); 
Các vấn đề liên quan