Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 似乎没有控制器被我的控制器工厂识别_C#_Asp.net Mvc_Autofac_Controller Factory - Fatal编程技术网

C# 似乎没有控制器被我的控制器工厂识别

C# 似乎没有控制器被我的控制器工厂识别,c#,asp.net-mvc,autofac,controller-factory,C#,Asp.net Mvc,Autofac,Controller Factory,我想用Autofac创建一个controllerfactory,但此行出现空引用实例错误:string ctrName=contr.ControllerContext.RouteData.Values[“Controller”].ToString() 这是我的控制器工厂: internal class ControllerFactory : DefaultControllerFactory { private readonly Dictionary<string, Func<

我想用Autofac创建一个controllerfactory,但此行出现空引用实例错误:
string ctrName=contr.ControllerContext.RouteData.Values[“Controller”].ToString()

这是我的
控制器工厂

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);
    }
}
更新:我检查了foreach上的调试器。项目类型为
WebApplication1.Controllers。HomeController
表示我的主控制器,但mt项目的控制器上下文为空

这意味着您可以访问 ControllerContext属性是通过重写执行或初始化 方法(但首先调用base.Execute或base.Initialize):

后一个(初始化)是您执行操作的绝对最早点 可以使用ControllerContext属性,除非处理 分配给自己,这是不推荐的(作为任务的一部分) 框架将取决于是否将该属性分配给 当时)

资料来源:


您必须根据此新信息将您的
控制器映射到其他地方。

仅在HTTP请求期间,
ControllerContext
才有效。断点,以便您可以首先检查
ControllerContext.RoutedData.Values
以查看其中的内容。其次,您是否有两个
HomeController
?@RagingCain没有我没有两个…我检查了每个项目的断点和控制器上下文为空..并且在lstControllers“WebApplication1.Controllers.HomeController”中只有一个项目但它的上下文是null@ImanSalehi如果您能添加所述对象属性的屏幕截图,可能是“控制器”是引用所述对象的无效键。也许它应该是“家”。控制器有一些自动映射的魔力。@ragingcaintnx@raving。但是你的源代码对我没有用处,因为我认为我的控制器工厂类与之不同,它有一些我没有的属性,而且它似乎与我的类没有相同的类型。不幸的是,在任何地方都没有关于(控制器工厂…icontroller工厂或默认控制器工厂…)的任何复杂示例。根据我的研究,每个人都有自己的解决方案。我对此完全糊涂了
        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);
    }
   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();
    }

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