C# 似乎没有控制器被我的控制器工厂识别
我想用Autofac创建一个controllerfactory,但此行出现空引用实例错误: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<
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.
}