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".
¿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
en alguna clase (no en una acción y no en una vista) – Alexandre
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