2010-11-26 8 views
5

Estoy obteniendo lo anterior cuando intento abrir una vista en un controlador en un Área. Ninject está configurado como sigue:IControllerFactory 'MyWebSite.WebUI.Infrastructure.NinjectControllerFactory' no devolvió un controlador para el nombre 'Admin'

public class NinjectControllerFactory : DefaultControllerFactory 
{ 
    private IKernel kernel = new StandardKernel(new RLSBCWebSiteServices()); 

    protected override IController GetControllerInstance(RequestContext context, Type controllerType) 
    { 
     if (controllerType == null) 
      return null; 
     return (IController)kernel.Get(controllerType); 
    } 

    private class MyWebSiteServices : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IMatchesRepository>().To<SqlMatchesRepository>().WithConstructorArgument("connectionString", 
       ConfigurationManager.ConnectionStrings["MyWebSiteDb"].ConnectionString); 
     } 
    } 
} 

Si coloco un punto de interrupción en el código, I ver el contexto RequestContext contiene los siguientes valores:

context.RouteData.DataTokens.Values[0] = “MyWebSite.WebUI.Areas.Visitor” context.RouteData.DataTokens.Values[1] = “Visitor” which is the Area 
context.RouteData.Values.Values[0] = “admin” which is the Controller 
context.RouteData.Values.Values[1] = “register” which is the View 

Sin embargo controllerType == null, en lugar en el controlador nombre.

Esta transferencia a la nueva página se active mediante

Html.ActionLink("here", "Register", "Admin", new { area = "Visitor" }, null) 

que se encuentra en la página de inicio de sesión. Sin embargo lo mismo sucede si entro

http://example.com/Visitor/admin/register 

en IE8

El registro área es como sigue:

public class VisitorAreaRegistration : AreaRegistration 
{ 
    public override string AreaName { get { return "Visitor"; } } 

    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "Visitor_default", 
      "Visitor/{controller}/{action}/{id}", 
      new { controller = "Admin", action = "Register", id = UrlParameter.Optional } 
     ); 
    } 
} 

nadie ha conseguido que las áreas de trabajo con NinjectControllerFactory, o hay algo mal con mi configuración?

Respuesta

3

En lugar de crear su propia NinjectControllerFactory, utilice la última versión de Ninject.Web.Mvc. Es compatible con las áreas. Ver: https://github.com/ninject/ninject.web.mvc

+0

Lo miré cuando descargué Ninject en primer lugar, pero pensé que el .dll que utilicé era la versión compilada de esto. Entonces, ahora descargué esta versión pero los documentos son muy escasos. ¿Hay algo que sugieras que me ayude a configurar las cosas? – xiecs

+0

Eche un vistazo a la aplicación de muestra. Eso viene con el código fuente –

+0

He descargado la fuente, la he instalado y he mostrado con éxito el sitio web de Ninject. Al mirar a través de la fuente, es mucho más complicado de lo que quiero, con Spark, Elmah, Newtonsoft, etc. Mucho de eso está por encima de mí. Noté que no usa Áreas en su sitio web. También eché un vistazo a JavascriptRouteGenerator.cs. Parece que no hay nada allí que sugiera que maneja áreas. Realicé algunos cambios en función del código fuente, que son demasiado grandes para enumerarlos aquí. Todavía recibo un mensaje de error que dice que no puede encontrar la URL solicitada. – xiecs

Cuestiones relacionadas