2012-03-17 19 views
10

tôi cố gắng viết lại và tùy chỉnh @Html.ActionLink, trong một trong những quá tải của phương pháp này các thông số như sau:Tìm tên Diện tích và điều khiển Tên trong HtmlHelper tùy chỉnh với ASP.NET MVC3

public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, 
             string linkText, string actionName); 

Và tôi muốn một cái gì đó giống như trên và cũng cần phải tìm AreaName và ControllerName mà không vượt qua nó bằng cách tham số, tôi nghĩ rằng để sử dụng các nội dung sau:

string controller = ViewContext.RouteData.Values["Controller"]; 
string area = ViewContext.RouteData.DataTokens["Area"]; 

nhưng lỗi tăng như:

An object reference is required for the non-static field, method, or property 
'System.Web.Mvc.ControllerContext.RouteData.get' 

Và rõ ràng là tôi sử dụng tĩnh, vậy đề xuất của bạn là gì để tìm Tên Khu vực và Tên Bộ điều khiển trong HtmlHelpers?

Trả lời

22

Sử dụng này:

string controllerName = 
(string)htmlHelper.ViewContext.RouteData.GetRequiredString("controller"); 

string areaName = 
(string)htmlHelper.ViewContext.RouteData.DataTokens["area"]; 
+0

Và đối với hành động chỉ sử dụng: var actionName = htmlHelper.ViewContext.RouteData.GetRequiredString ("action"); – Roboblob

0

Tôi tin rằng "bộ điều khiển" và "khu vực" phải thấp hơn. Dưới đây là làm thế nào để có được giá trị diện tích:

ASP.NET MVC - Get Current Area Name in View or Controller

Nếu không được hiện trong một khu vực nó sẽ cung cấp cho một ngoại lệ tham chiếu đối tượng, vì vậy kiểm tra null đầu tiên và sau đó thiết lập giá trị nếu nó không phải là null. Bộ điều khiển của bạn cũng chính xác, chỉ cần thử nó trong trường hợp thấp hơn. Hy vọng điều này sẽ giúp

3
public static MvcHtmlString ActionLink(
    this HtmlHelper htmlHelper, 
    string linkText, 
    string actionName 
) 
{ 
    RouteData rd = htmlHelper.ViewContext.RouteData; 
    string currentController = rd.GetRequiredString("controller"); 
    string currentAction = rd.GetRequiredString("action"); 

    // the area is an optional value and it won't be present 
    // if the current request is not inside an area => 
    // you need to check if it is null or empty before using it 
    string area = rd.Values["area"] as string; 

    ... 
} 
+1

'rd.Values ​​[ "khu vực"] như chuỗi; 'luôn được trả về null. – Saeid