3

我的目标是从它的名称和区域中找到一个控制器。如果我的电流httpContext与要找到的控制器在同一区域内,我已经成功地做到了这一点。但是,我无法打电话给ControllerFactory考虑区域。这是我的代码:

public static ControllerBase GetControllerByName(this HtmlHelper htmlHelper, string controllerName)
    {
      IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
      IController controller = factory.CreateController(htmlHelper.ViewContext.RequestContext, controllerName);
      if (controller == null)
      {
        throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, "The IControllerFactory '{0}' did not return a controller for the name '{1}'.", factory.GetType(), controllerName));
      }
      return (ControllerBase)controller;
    }

由于它采用 aRequestContext作为参数,因此我向其添加了“区域”的路由值,但没有任何变化。我可以用 requestContext 做些什么来考虑一些区域吗?我是否需要覆盖控制器工厂——如果是这样,什么特别处理区域区分?

更新:

这是我拥有的 AreaRegistration 示例:

public class StoresAreaRegistration : AreaRegistration
  {
    public override string AreaName { get { return "Stores"; } }

    public override void RegisterArea(AreaRegistrationContext context)
    {
      context.MapRoute(
          AreaName,
          AreaName + "/{controller}/{action}/{id}",
          new { area = AreaName, controller = "Home", action = "Index", id = UrlParameter.Optional }
      );
    }
  }
4

1 回答 1

9

用于定位控制器的区域和命名空间位于 RequestContext 的 RouteData 中。默认情况下,它们会根据您当前提供的请求进行填充,如果您需要更改它们,则必须在调用 CreateController 之前这样做。当找不到控制器时,您可能会遇到异常,因此您也必须考虑到这一点。

更新:注意,您必须创建一个新的 RequestContext。如果您重用现有的,它将在此请求的后续部分中混淆操作和视图的解析。

var tempRequestContext = new RequestContext(Request.RequestContext.HttpContext, new RouteData());
tempRequestContext.RouteData.DataTokens["Area"] = "";
tempRequestContext.RouteData.DataTokens["Namespaces"] = "YourCompany.Controllers";
var controller = ControllerBuilder.Current.GetControllerFactory()
                .CreateController(tempRequestContext, "ControllerName");

if(controller != null)
{
    //TODO: Implement your logic here
}
于 2013-02-22T22:43:06.370 回答