Я створив обхід, який, здається, працює досить добре. Я виявив необхідність перейти на контекст іншого контролера для пошуку імені дії, пошуку перегляду тощо. Для цього я створив новий метод розширення для 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
компонент маршруту не мінявся, але в нашому коді поки що, схоже, немає жодного негативу такому підходу.