Tôi đã tạo ra một cách giải quyết có vẻ như đang hoạt động khá tốt. Tôi thấy cần phải chuyển sang ngữ cảnh của một bộ điều khiển khác để tra cứu tên hành động, tra cứu xem, v.v. Để thực hiện điều này, tôi đã tạo một phương thức mở rộng mới cho HtmlHelper
:
public static IDisposable ControllerContextRegion(
this HtmlHelper html,
string controllerName)
{
return new ControllerContextRegion(html.ViewContext.RouteData, controllerName);
}
ControllerContextRegion
được định nghĩa là:
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;
}
}
Cách thức này được sử dụng trong một khung nhìn như sau:
@using (Html.ControllerContextRegion("Foo")) {
// Html.Action, Html.Partial, etc. now looks things up as though
// FooController was our controller.
}
Có thể có các tác dụng phụ không mong muốn cho việc này nếu mã của bạn yêu cầu controller
thành phần tuyến đường không thay đổi, nhưng trong mã của chúng tôi cho đến nay, dường như không có bất kỳ tiêu cực nào đối với phương pháp này.