Я создал обходной путь, который, кажется, работает довольно хорошо. Я обнаружил необходимость переключиться в контекст другого контроллера для поиска имени действия, просмотра представления и т. Д. Чтобы реализовать это, я создал новый метод расширения для HtmlHelper
:
public static IDisposable ControllerContextRegion(
this HtmlHelper html,
string controllerName)
{
return new ControllerContextRegion(html.ViewContext.RouteData, controllerName);
}
ControllerContextRegion
определяется как:
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;
}
}
То, как это используется в представлении, выглядит следующим образом:
@using (Html.ControllerContextRegion("Foo")) {
// Html.Action, Html.Partial, etc. now looks things up as though
// FooController was our controller.
}
Это может привести к нежелательным побочным эффектам, если ваш код требует, чтобы controller
компонент маршрута не изменился, но в нашем коде пока что нет никаких отрицательных моментов для этого подхода.