2011-05-19 11 views
18

Estoy usando el siguiente código para obtener la "acción" actual en mi vista porque quiero crear un actionlink personalizado basado en él.Manera más simple de acceder a RouteData.Values ​​from View

ViewContext.RequestContext.RouteData.Values("action") 

Mi objetivo final es construir algunos enlaces de acción con Javascript, y los Js necesita saber lo que el controlador y la acción actual es ya que me gustaría que ser flexible. Encontré lo anterior navegando por el marco, pero no sé si he encontrado lo correcto.

decir

var routeData = ViewContext.RequestContext.RouteData; 
var linkStub = '/@routeData.Values("controller")/@routeData.Values("action")'; 

¿Alguien sabe si esto es la forma más fácil/más sencilla de hacer esto?

+0

¿No es eso bastante sencillo? ¿Qué pasa con eso? Inicie sesión en esta publicación de blog http://blog.janjonas.net/2011-02-15/aspnet-mvc_3-get-controller-action-razor-view –

+0

puede especificar qué es lo que quiere hacer – maxlego

+0

Supongo que ' No estoy seguro de estar sacando esta información del lugar correcto. Parece que tengo que navegar a través de muchos objetos para llegar a esta información y me preocupa que la esté complicando demasiado o que no esté realmente activando la acción actual. –

Respuesta

26

manera más limpia sería un método de extensión

public static class MyUrlHelper 
{ 
    public static string CurrentAction(this UrlHelper urlHelper) 
    { 
     var routeValueDictionary = urlHelper.RequestContext.RouteData.Values; 
     // in case using virtual dirctory 
     var rootUrl = urlHelper.Content("~/"); 
     return string.Format("{0}{1}/{2}/", rootUrl, routeValueDictionary["controller"], routeValueDictionary["action"]); 
    } 
} 
+0

Gracias. Me gusta esta solución. ¿Es posible incluir valores de ruta (parámetros del método del controlador)? – mosquito87

+0

¿Cuál debería ser el resultado? url actual? – maxlego

13

Se obtiene datos de la ruta de RequestContext, y que en realidad no importa cómo llegar a eso (hay múltiples maneras). No me preocuparía pasar por múltiples objetos (probablemente solo tome unos pocos microsegundos). Puede hacer que el código sea más agradable, ya sea creando un método de extensión (por ejemplo, url helper) o haciendo que el control en cuestión herede la implementación personalizada de WebViewPage donde crea un acceso directo para lo que necesita. De esa manera:

public abstract class MyWebViewPage<TModel> : WebViewPage<TModel> 
{ 
    public string ControllerName 
    { 
     get 
     { 
      return Url.RequestContext.RouteData.Values["controller"].ToString(); 
     } 
    } 

    public string ActionName 
    { 
     get 
     { 
      return Url.RequestContext.RouteData.Values["action"].ToString(); 
     } 
    } 
} 
+0

Gracias o las aclaraciones Necros, esa es información realmente útil para saber. –

Cuestiones relacionadas