ฉันได้สร้างวิธีแก้ปัญหาที่ดูเหมือนว่าจะทำงานได้ดี ฉันพบว่าจำเป็นต้องเปลี่ยนไปใช้บริบทของตัวควบคุมที่แตกต่างกันสำหรับการค้นหาชื่อการกระทำ, การค้นหาการดูเป็นต้นเมื่อต้องการใช้สิ่งนี้ฉันได้สร้างวิธีการขยายใหม่สำหรับ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
ส่วนประกอบเส้นทางจะไม่เปลี่ยนแปลง แต่ในรหัสของเราจนถึงขณะนี้ดูเหมือนจะไม่เป็นเชิงลบต่อวิธีการนี้