2012-03-17 21 views
10

provo a riscrivere e personalizzare @Html.ActionLink, in uno dei sovraccarichi di questo metodo i parametri sono:Trova nome Area e Nome del controller in HtmlHelper personalizzato con ASP.NET MVC3

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

E voglio qualcosa di simile a quanto sopra e anche bisogno di trovare AreaName e NomeControllore senza farla passare da parametri, penso di usare i seguenti:

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

ma l'aumento errore come:

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

E ovviamente io uso statico, quindi qual è il tuo suggerimento per trovare il nome dell'area e il nome del controller in HtmlHelpers?

risposta

22

Utilizzare questa:

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

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

E per l'azione basta usare: var actionName = htmlHelper.ViewContext.RouteData.GetRequiredString ("action"); – Roboblob

0

Credo che "controller" e "area" dovrebbero essere in minuscolo. Ecco come ottenere il valore dell'area:

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

Se non attualmente in un'area darebbe un'eccezione oggetto di riferimento, in modo da verificare per nulla prima e quindi impostare il valore se non è nullo. Anche il controller è corretto, provalo solo in minuscolo. Spero che questo aiuti

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 ​​[ "area"] come stringa;' restituita sempre null. – Saeid

Problemi correlati