2012-03-17 20 views
10

Trato de volver a escribir y personalizar @Html.ActionLink, en una de las sobrecargas de este método, los parámetros son:Encontrar Nombre del área y el nombre del controlador en HtmlHelper personalizada con ASP.NET MVC3

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

Y quiero algo así como el anterior y también la necesidad de encontrar AreaName y ControllerName sin pasarlo por parámetros, creo que utilizar los siguientes:

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

pero el aumento de error como:

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

Y, obviamente, yo uso estática, ¿cuál es su sugerencia para encontrar el nombre del área y el nombre del controlador en HtmlHelpers?

Respuesta

22

Utilice esta:

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

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

Y para la acción simplemente use: var actionName = htmlHelper.ViewContext.RouteData.GetRequiredString ("action"); – Roboblob

0

Creo que "controlador" y "área" deben estar en minúsculas. Aquí es cómo conseguir el valor del área:

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

Si no está en un área que le daría una excepción de referencia de objeto, a fin de comprobar de primera nula y luego ajustar el valor si no es nulo. Su controlador también es correcto, solo inténtelo en minúsculas. Espero que esto ayude

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 ​​[ "zona"] como cadena;' siempre se devuelve nulo. – Saeid

Cuestiones relacionadas