2010-04-14 7 views

Respuesta

16

Algo como esto para el regulador:

string controller = RouteData.GetRequiredString("controller"); 

Y para la acción:

string action = RouteData.GetRequiredString("action"); 

Por ejemplo, puede usarlo en su base de clase del controlador:

public class YouControllerBase: Controller 
    { 
      protected override void Execute(System.Web.Routing.RequestContext requestContext) 
      { 
       string controller = requestContext.RouteData.GetRequiredString("controller"); 
       string action = requestContext.RouteData.GetRequiredString("action"); 
      } 
    } 

O utilizarlo en global.asax:

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     RouteData routeData = RouteTable.Routes.GetRouteData(
      new HttpContextWrapper(HttpContext.Current)); 
     var action = routeData.GetRequiredString("action"); 
    } 
+0

Muchas gracias, esto es simple y útil. La desventaja es la suposición de que cada controlador hereda confiablemente de una clase base común. –

+0

Edité la publicación. Puede usar global.asax en su lugar si no desea crear una clase de controlador base – wassertim

0

El controlador y la acción que se utilizan están determinados por las rutas registradas. Busque en su Global.ascx.cs

Aquí está la asignación de ruta predeterminada que viene de serie con una nueva aplicación MVC. Entonces, si su url es http://yourdomain/SomeSiteSection/SomeThing/ entonces MVC buscará un controlador llamado SomeSiteSectionController y una Acción llamada SomeThing.

public class MvcApplication : System.Web.HttpApplication 
{ 

    //... 

    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default",            // Route name 
      "{controller}/{action}/{id}",       // URL with parameters 
      new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
     ); 

    } 

    protected void Application_Start() 
    { 
     RegisterRoutes(RouteTable.Routes); 
    } 
} 
0

Depende de las rutas que están registrados para resolver la URL

Las convenciones predeterminada es la siguiente:

public class MvcApplication : System.Web.HttpApplication 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       "Default",            // Route name 
       "{controller}/{action}/{id}",       // URL with parameters 
       new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
      ); 

     } 

     protected void Application_Start() 
     { 
      RegisterRoutes(RouteTable.Routes); 
     } 
    } 

acción index se llamará en HomeController.

2

Pete,

en el código, se puede utilizar un actionfilter para determinar qué se está encendiendo:

public class AddUrlInfoToSessionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      // where we are now - do something with the vars in real app 
      var currentActionName = filterContext.ActionDescriptor.ActionName; 
      var currentControllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; 
      var currentRouteData = filterContext.RouteData; 
      var currentUrlInfo = new UrlHelper(filterContext.RequestContext); 
      string url = RouteTable.Routes.GetVirtualPath(filterContext.RequestContext, currentRouteData.Values).VirtualPath; 
     } 
    } 
} 

y luego decorar cada Controlador que le interese como a continuación (o ponerlo en un controlador de base):

[HandleError] 
[AddUrlInfoToSessionAttribute] 
public class HomeController : Controller 
{ 
    // controller stuff 
} 

[AddUrlInfoToSession] 
public abstract class BaseController : Controller 
{ 

} 

esperanza esto ayuda

Jim

EDIT: simplemente ordenaban el ejemplo un poco añadiendo lo siguiente al método de filtro:

cadena url = RouteTable.Routes.GetVirtualPath (filterContext.RequestContext, currentRouteData.Values) .VirtualPath;

+0

Me interesan todos los controladores. –

+0

pete - entonces tendría que decorar todos los controladores con el indicador [AddUrlInfoToSessionAttribute]. esto puede o no ser un gran problema dependiendo de la base de código existente. De hecho, utilizo una versión más completa del código anterior en algunas aplicaciones con el fin de realizar un seguimiento de los datos de ruta anteriores, por lo que funciona bien. –

+0

Creo que en la mayoría de los casos una aplicación tendría una clase base generalmente utilizada, por lo que si se pudiera confiar en ella, entonces esta idea debería funcionar ... ¡Lo intentaré! –

1

dos sencillos pasos:

  1. Añadir 2 referencia en su proyecto: MvcFakes.dll,RouteDebugger.dll
  2. Al entrar en la siguiente URL: /RouteDebugger

Los 2 dlls están contenidas here

Chapter09Code.zip \ Code \ CS \ MvcApplication1 \ MvcApplication1 \ bin

Cuestiones relacionadas