3

私の目標は、名前とエリアからコントローラーを見つけることです。私の現在httpContextが発見されるべきコントローラと同じエリア内にある場合、私はこれを成功させました。ただし、ControllerFactoryArea を考慮に入れるために を呼び出すことができません。これが私のコードです:

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;
    }

をパラメータとして取っているのでRequestContext、「area」というルート値を追加しましたが、変更はありません。領域を考慮して requestContext でできることはありますか? コントローラ ファクトリをオーバーライドする必要がありますか? もしそうなら、特に Area の区別を処理するものは何ですか?

アップデート:

これが私が持っている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 を呼び出す前に変更する必要があります。コントローラーが見つからない場合は例外が発生する可能性があるため、それも考慮する必要があります。

UPDATE : 新しい 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 に答える