Eu criei uma solução alternativa que parece estar funcionando muito bem. Eu encontrei a necessidade de mudar para o contexto de um controlador diferente para pesquisar nomes de ações, visualizar pesquisas etc. Para implementar isso, criei um novo método de extensão para HtmlHelper
:
public static IDisposable ControllerContextRegion(
this HtmlHelper html,
string controllerName)
{
return new ControllerContextRegion(html.ViewContext.RouteData, controllerName);
}
ControllerContextRegion
é definido como:
internal class ControllerContextRegion : IDisposable
{
private readonly RouteData routeData;
private readonly string previousControllerName;
public ControllerContextRegion(RouteData routeData, string controllerName)
{
this.routeData = routeData;
this.previousControllerName = routeData.GetRequiredString("controller");
this.SetControllerName(controllerName);
}
public void Dispose()
{
this.SetControllerName(this.previousControllerName);
}
private void SetControllerName(string controllerName)
{
this.routeData.Values["controller"] = controllerName;
}
}
A maneira como isso é usado em uma visualização é a seguinte:
@using (Html.ControllerContextRegion("Foo")) {
// Html.Action, Html.Partial, etc. now looks things up as though
// FooController was our controller.
}
Pode haver efeitos colaterais indesejados para isso, se o seu código exigir que o controller
componente de rota não seja alterado, mas em nosso código até agora, não parece haver nenhum negativo nessa abordagem.