2011-10-23 13 views
16

sé cómo obtener el nombre del controlador actualAsp.net MVC 3- obtener la instancia de controlador de corriente (no sólo el nombre)

HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString(); 

Pero, ¿hay alguna manera de obtener la instancia del regulador de intensidad de alguna clase (no en una acción y no en una vista)?

+1

¿Dónde? En un modelo? En una vista? Por supuesto, si estás en una acción, puedes usar esto para referirte a tu controlador, pero supongo que ese no es el caso :). – BigMike

+0

en alguna clase (no en una acción y no en una vista) – Alexandre

+0

ya que en el patrón MVC está obligado a estar en una acción, a menos que esté en el flujo de algún Modelo de Datos o algún ayudante. Solo para evitar referencias nulas, agregaría un parámetro a su método de clase para el controlador, y luego rastrearía dónde comienza el flujo y lo pasaría. – BigMike

Respuesta

22

Por defecto, solo se puede acceder al Controller actual dentro de un controlador con ControllerContext.Controller o dentro de una vista con ViewContext.Context. Para acceder desde alguna clase, debe implementar un ControllerFactory personalizado que almacene la instancia del controlador en algún lugar y la recupere desde allí. Por ejemplo, en el Request.Items:

public class MyControllerFactory : DefaultControllerFactory 
{ 
    public override IController CreateController(RequestContext requestContext, string controllerName) 
    { 
     var controller = base.CreateController(requestContext, controllerName); 
     HttpContext.Current.Items["controllerInstance"] = controller; 
     return controller; 
    } 
} 

A continuación, registrarlo en su Application_Start:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory()); 

y se puede obtener la instancia del controlador después:

public class SomeClass 
{ 
    public SomeClass() 
    { 
     var controller = (IController)HttpContext.Current.Items["controllerInstance"]; 
    } 
} 

pero me gustaría encontrar alguna otra manera pasar la instancia del controlador a mi clase en lugar de esta solución "hacky".

+6

Probablemente debería cambiar HttpContext.Current.Session ["controllerInstance"] a HttpContext.Current.Items ["controllerInstance"] ya que la sesión podría terminar en la base de datos con ciertas configuraciones. – John

0

alguien tendrá que corregir si lo que estoy haciendo es perjudicial para el conjunto Asp.Net ciclo de vida de la página/lo que sea, pero sin duda se puede hacer esto:

En controlador

ViewBag.CurrentController = this; 

En vista

var c = ViewBag.CurrentController; 
var m1 = BaseController.RenderViewToString(c, "~/Views/Test/_Partial.cshtml", null); 

En mi caso, tenía un controlador de base que todos los controladores se extienden. En ese controlador base vivía un método estático llamado RenderViewToString y requería un controlador. Como pensé que podría instanciar una nueva instancia de un controlador vacío en este punto para c, simplemente lo envié a la vista en el encantador contenedor ViewBag que existe en el mundo de Asp.Net MVC. Por razones en las que no podía entrar ahora, no pude recuperar la secuencia en el controlador y enviar de vuelta a la vista (esto era lo que había hecho antes de que se modificaran los requisitos).

La razón por la que lo he hecho de esta manera es en otros lenguajes como PHP y JS, hay formas similares y sencillas de transferir clases.

Cuestiones relacionadas