Найти имя области и имя контроллера в пользовательском Htmlhelper с ASP.NET MVC3 - PullRequest
10 голосов
/ 17 марта 2012

Я пытаюсь переписать и настроить @Html.ActionLink, в одной из перегрузок этого метода параметры:

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

И я хочу что-то подобное выше, а также нужно найти AreaName и ControllerName без передачи его по параметрам, я думаю использовать следующее:

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

но ошибка возрастает как:

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

И, очевидно, я использую static, так что вы предлагаете найти Имя области и Имя контроллера в HtmlHelpers?

Ответы [ 3 ]

23 голосов
/ 17 марта 2012

Используйте это:

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

string areaName = 
(string)htmlHelper.ViewContext.RouteData.DataTokens["area"];
4 голосов
/ 17 марта 2012
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;

    ...
}
0 голосов
/ 17 марта 2012

Я считаю, что «контроллер» и «область» должны быть в нижнем регистре. Вот как можно получить значение площади:

ASP.NET MVC - Получить имя текущей области в представлении или контроллере

Если в данный момент нет в области, это приведет к исключению ссылки на объект, поэтому сначала проверьте наличие нуля, а затем установите значение, если оно не равно нулю. Ваш контроллер также правильно, просто попробуйте в нижнем регистре. Надеюсь, это поможет

...