Per impostazione predefinita è possibile accedere solo allo Controller
corrente all'interno di un controller con o all'interno di una vista con ViewContext.Context
. Per accedervi da qualche classe è necessario implementare un custom ControllerFactory
che memorizza l'istanza del controller da qualche parte e recuperarla da lì. Ad esempio, nel 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;
}
}
Poi registrazione nel vostro Application_Start
:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
e si può ottenere l'istanza di controllo in seguito:
public class SomeClass
{
public SomeClass()
{
var controller = (IController)HttpContext.Current.Items["controllerInstance"];
}
}
ma vorrei trovare un altro modo passare l'istanza del controller alla mia classe invece di questa soluzione "hacky".
Dove? In un modello? In una vista? Ovviamente se stai facendo un'azione puoi usare questo per fare riferimento al tuo controller, ma suppongo che non sia così :). – BigMike
in alcune classi (non in un'azione e non in una vista) – Alexandre
poiché in pattern MVC si è obbligati a partecipare a un'azione, a meno che non ci si trovi nel flusso del metodo di alcuni modelli di dati o in qualche aiuto. Solo per evitare riferimenti null aggiungerei un parametro al metodo di classe per il controller, quindi tracciamo dove inizia e passa il flusso. – BigMike