Ich habe eine Problemumgehung erstellt, die ziemlich gut zu funktionieren scheint. Ich habe festgestellt, dass für die Suche nach Aktionsnamen, die Suche nach Ansichten usw. in den Kontext eines anderen Controllers gewechselt werden muss. Um dies zu implementieren, habe ich eine neue Erweiterungsmethode erstellt für HtmlHelper
:
public static IDisposable ControllerContextRegion(
this HtmlHelper html,
string controllerName)
{
return new ControllerContextRegion(html.ViewContext.RouteData, controllerName);
}
ControllerContextRegion
ist definiert als:
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;
}
}
In einer Ansicht wird dies folgendermaßen verwendet:
@using (Html.ControllerContextRegion("Foo")) {
// Html.Action, Html.Partial, etc. now looks things up as though
// FooController was our controller.
}
Dies kann zu unerwünschten Nebenwirkungen führen, wenn Ihr Code erfordert, dass sich die controller
Routenkomponente nicht ändert. In unserem Code scheint dieser Ansatz jedoch bisher keine negativen Auswirkungen zu haben.