私はAutofacでcontrollerfactoryを作成したいが、私はこの行にnull参照インスタンスエラーがある: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);
}
}
と、これは私のAPPSTARTです:
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
がnullである...しかし、なぜですか?私は、溶液中のコントローラを持っている:
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..theアイテム・タイプにデバッガを視察WebApplication1.Controllers.HomeController
は正確に私のホームコントローラが、MT項目のコントローラコンテキストがnullであることを意味しています!
'ControllerContext'は、HTTPリクエスト中にのみ有効です。 – DavidG
ブレークポイントでは、最初に 'contr.ControllerContext.RouteData.Values'を調べて何が入っているのかを見ることができます。第二に、あなたは二つの 'HomeController'を持っていますか? – HouseCat
@RagingCainいいえ、2つありません...私は、foreach項目のブレークポイントとコントローラのコンテキストを検査しました.lstControllers "WebApplication1.Controllers.HomeController"には1つの項目しかありませんでしたが、コントローラコンテキストはnullです –