【问题标题】:Seems No Controllers Recognized by my controller factory我的控制器工厂似乎没有识别控制器
【发布时间】:2017-03-07 13:53:34
【问题描述】:

我想用 Autofac 创建一个控制器工厂,但是我在运行我的项目时在这一行出现空引用实例错误:string ctrName = contr.ControllerContext.RouteData.Values["Controller"].ToString()

这是我的controller factory

internal class ControllerFactory : DefaultControllerFactory
{
    private readonly Dictionary<string, Func<RequestContext, IController>> _controllerMap;

    public ControllerFactory()
    {
        List<IController> lstControllers = DependencyResolver.Current.GetServices<IController>().ToList();
        _controllerMap = new Dictionary<string, Func<RequestContext, IController>>();

        foreach (Controller contr in lstControllers)
        {
            string ctrName = contr.ControllerContext.RouteData.Values["Controller"].ToString();  //iv got null instance error in this line
            _controllerMap.Add(ctrName, c => contr);
        }
    }

    public override IController CreateController(RequestContext requestContext, string controllerName)
    {

        if (_controllerMap.ContainsKey(controllerName))
        {
            return _controllerMap[controllerName](requestContext);
        }
        else
            throw new KeyNotFoundException(controllerName);
    }
}

这是我的应用启动:

        protected void Application_Start()
    {

        var builder = new ContainerBuilder();

        builder.RegisterControllers(typeof(MvcApplication).Assembly).AsImplementedInterfaces();

        builder.Register(s => new ControllerFactory()).As<IControllerFactory>();


        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));


        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

错误原因很清楚:我的 foreach 项目的ControllerContext 为空...但是为什么呢?我的解决方案中有控制器:

   public class HomeController : Controller 
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }

    public ActionResult Contact()
    {
        ViewBag.Message = "Your contact page.";

        return View();
    }

}

更新:我在 foreach 上检查了调试器。项目类型为 WebApplication1.Controllers.HomeController 意味着正是我的主控制器,但 mt 项目的控制器上下文为空!!!

【问题讨论】:

  • ControllerContext 仅在 HTTP 请求期间有效。
  • 断点,因此您可以首先检查contr.ControllerContext.RouteData.Values 以查看其中的内容。其次,你有两个HomeController吗?
  • @RagingCain 不,我没有两个...我检查了断点,并且 foreach 项目的控制器上下文为空.. lstControllers“WebApplication1.Controllers.HomeController”中只有一个项目,但控制器上下文其中为空
  • @ImanSalehi 您能否添加该对象属性的屏幕截图,可能是“控制器”是引用该对象的无效键。也许它应该是“家”。控制器有一些自动映射的魔力。

标签: c# asp.net-mvc autofac controller-factory


【解决方案1】:

这意味着您可以访问的最早时间点 ControllerContext 属性是通过覆盖 Execute 或 Initialize 方法(但首先调用 base.Execute 或 base.Initialize):

protected override void Execute(RequestContext requestContext)
{
  base.Execute(requestContext);

  // .ControllerContext is available from this point forward.
}

protected override void Initialize(RequestContext requestContext)
{
  base.Initialize(requestContext);

  // .ControllerContext is available from this point forward.
}

后者(初始化)是绝对最早的点 可以使用 ControllerContext 属性,除非您处理了 自己分配,不建议这样做(作为 框架将取决于将该属性分配给 那个时候)。

来源:Null ControllerContext in my custom controller inheriting from BaseController

根据此新信息,您将不得不在其他地方 map 您的 Controllers

【讨论】:

  • TNX @Raging。但是您的来源对我没有用,因为我认为我的控制器工厂类与此不同,它具有一些我没有的属性,并且似乎与我的类没有相同类型。不幸的是,在任何地方都没有关于(控制器工厂...icontroller 工厂或默认控制器工厂..)的任何复杂示例。根据我的搜索,每个人都通过自己的解决方案使用它。我完全搞糊涂了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
相关资源
最近更新 更多