He creado una solución alternativa que parece estar funcionando bastante bien. Encontré la necesidad de cambiar al contexto de un controlador diferente para la búsqueda de nombre de acción, búsqueda de vista, etc. Para implementar esto, creé un nuevo método de extensión para HtmlHelper
:
public static IDisposable ControllerContextRegion(
this HtmlHelper html,
string controllerName)
{
return new ControllerContextRegion(html.ViewContext.RouteData, controllerName);
}
ControllerContextRegion
Se define 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;
}
}
La forma en que se usa dentro de una vista es la siguiente:
@using (Html.ControllerContextRegion("Foo")) {
// Html.Action, Html.Partial, etc. now looks things up as though
// FooController was our controller.
}
Puede haber efectos secundarios no deseados para esto si su código requiere que el controller
componente de ruta no cambie, pero en nuestro código hasta ahora, no parece haber ningún aspecto negativo en este enfoque.