2010-12-11 47 views
6

Tôi có một lớp được sử dụng bởi bộ điều khiển tại [Project] .Controllers và bởi bộ điều khiển tại các khu vực khác nhau. Làm thế nào tôi có thể xác định vị trí của bộ điều khiển? (Tôi đoán tôi có thể nhìn vào các thuộc tính của HttpContext.Current.Request - nhưng tôi đang tìm một cách MVC "thích hợp"). Cảm ơn bạn.Làm thế nào để hiện đang thực hiện khu vực?

Đó là:

[Project].Helpers // called by: 
[Project].Controllers 
[Project].Areas.[Area].Controllers 
// how could I determine the caller from [Project].Helpers? 

Trả lời

16

Chúng tôi cố tình không để lộ cách lấy tên khu vực hiện tại từ yêu cầu MVC vì "a rea "chỉ đơn giản là một thuộc tính của một tuyến đường. Nó không đáng tin cậy cho các mục đích sử dụng khác. Đặc biệt, nếu bạn muốn bộ điều khiển của bạn có một số thuộc tính (suy nghĩ về thuật ngữ trừu tượng, không phải lớp System.Attribute) có thể được người trợ giúp sử dụng, thì những thuộc tính đó phải được tìm thấy trên bộ điều khiển, không có trên khu vực. Ví dụ thực tế, nếu bạn muốn một số logic (như một bộ lọc hành động) chạy trước bất kỳ bộ điều khiển nào trong một khu vực cụ thể, bạn phải kết hợp bộ lọc hành động với các bộ điều khiển đó trực tiếp. Cách dễ nhất để làm điều này là gán một số MyAreaBaseController với bộ lọc đó, sau đó để có mỗi bộ điều khiển mà bạn muốn liên kết một cách logic với vùng đó với lớp con đó. Bất kỳ cách sử dụng nào khác, chẳng hạn như bộ lọc toàn cục nhìn vào RouteData.DataTokens ["area"] để đưa ra quyết định, không được hỗ trợ và có khả năng gây nguy hiểm.

Nếu bạn thực sự, thực sự cần lấy tên khu vực hiện tại, bạn có thể sử dụng RouteData.DataTokens["area"] để tìm nó.

+0

Xin chào Levi đó là một câu trả lời tuyệt vời cảm ơn bạn. –

+1

Thật tuyệt khi được nghe từ nhóm .NET về vấn đề này. Câu trả lời của bạn có áp dụng khi ở trong chế độ xem không? Tôi có chế độ xem được chia sẻ được sử dụng ở các khu vực khác nhau và tôi muốn thay đổi diện mạo của nó dựa trên vị trí của người dùng trên trang web. Tôi có thể sử dụng một phần xem, nhưng sau đó quan điểm chính sẽ gần như trống rỗng. Đặt một cái gì đó trong ViewBag có vẻ sai bởi vì nó là logic trình bày nghiêm ngặt. –

4

Bạn sẽ có thể để có được những chuỗi khu vực từ RouteData:

// action inside a controller in an area 
public ActionResult Index() 
{ 
    var area = RouteData.DataTokens["area"]; 
    .... 
    return View(); 
} 

.. vì vậy bạn có thể thực hiện một phương pháp mở rộng cho những người giúp đỡ như thế này:

public static class SomeHelper // in [Project].Helpers 
{ 
    public static string Area(this HtmlHelper helper) 
    { 
     return (string)helper.ViewContext.RouteData.DataTokens["area"]; 
    } 
} 
Các vấn đề liên quan