Saya telah membuat solusi yang tampaknya bekerja cukup baik. Saya menemukan kebutuhan untuk beralih ke konteks pengontrol yang berbeda untuk pencarian nama tindakan, melihat pencarian, dll. Untuk menerapkan ini, saya membuat metode ekstensi baru untuk HtmlHelper
:
public static IDisposable ControllerContextRegion(
this HtmlHelper html,
string controllerName)
{
return new ControllerContextRegion(html.ViewContext.RouteData, controllerName);
}
ControllerContextRegion
didefinisikan sebagai:
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;
}
}
Cara ini digunakan dalam tampilan adalah sebagai berikut:
@using (Html.ControllerContextRegion("Foo")) {
// Html.Action, Html.Partial, etc. now looks things up as though
// FooController was our controller.
}
Mungkin ada efek samping yang tidak diinginkan untuk ini jika kode Anda mengharuskan controller
komponen rute untuk tidak berubah, tetapi dalam kode kami sejauh ini, tampaknya tidak ada negatif untuk pendekatan ini.