Oldukça iyi işleyen bir geçici çözüm oluşturdum. Eylem adı arama, görünüm arama vb. İçin farklı bir denetleyicinin bağlamına geçme ihtiyacını buldum. Bunu uygulamak için aşağıdakiler için yeni bir uzantı yöntemi oluşturdum HtmlHelper
:
public static IDisposable ControllerContextRegion(
this HtmlHelper html,
string controllerName)
{
return new ControllerContextRegion(html.ViewContext.RouteData, controllerName);
}
ControllerContextRegion
olarak tanımlanır:
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;
}
}
Bunun bir görünüm içinde kullanılma şekli şöyledir:
@using (Html.ControllerContextRegion("Foo")) {
// Html.Action, Html.Partial, etc. now looks things up as though
// FooController was our controller.
}
Kodunuz controller
rota bileşeninin değişmesini gerektiriyorsa bunun için istenmeyen yan etkiler olabilir , ancak şu ana kadar kodumuzda bu yaklaşım için herhangi bir olumsuzluk görünmemektedir.