J'ai un peu de problème. J'ai une zone appelée Framed. Cette zone a un contrôleur de la maison. La valeur par défaut pour le site a également un contrôleur de la maison. Ce que j'essaye de faire avec ceci est d'avoir une version de chaque contrôleur/action qui convient à un IFrame, et une version qui est le site normal. Je le fais à travers les pages maîtres, et la page maître du site a de nombreux détenteurs de contenu différent de la version encadrée. Pour cette raison, je ne peux pas échanger la page maître. Par exemple, http://example.com/Framed/Account/Index affichera une version très basique avec uniquement les informations de votre compte pour une utilisation sur un site externe. http://example.com/Account/Index affichera les mêmes données, mais à l'intérieur du site par défaut.MVC 2.0, StructureMap, zones et noms de contrôleurs en double
Mon conteneur IoC est structemap. Donc, j'ai trouvé http://odetocode.com/Blogs/scott/archive/2009/10/19/mvc-2-areas-and-containers.aspx et http://odetocode.com/Blogs/scott/archive/2009/10/13/asp-net-mvc2-preview-2-areas-and-routes.aspx. Voici ma configuration actuelle.
StructureMap Init
ObjectFactory.Initialize(x =>
{
x.AddRegistry(new ApplicationRegistry());
x.Scan(s =>
{
s.AssembliesFromPath(HttpRuntime.BinDirectory);
s.AddAllTypesOf<IController>()
.NameBy(type => type.Namespace + "." + type.Name.Replace("Controller", ""));
});
});
Le problème que j'ai trouvé à travers le débogage est que parce que les contrôleurs ont le même nom (HomeController), il enregistre seul le premier, qui est le contrôleur d'accueil par défaut. J'ai été créatif et j'ai ajouté l'espace de noms afin qu'il enregistre tous mes contrôleurs.
Default Route
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new[] { "MySite.Controllers" }
);
itinéraire Zone
context.MapRoute(
"Framed_default",
"Framed/{controller}/{action}/{id}",
new { area = "Framed", controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "MySite.Areas.Framed.Controllers" }
);
Comme recommandé par Phil Haack, j'utilise les espaces de noms comme le 4ème paramètre
application début, juste pour prouver l'ordre d'initialisation
protected void Application_Start()
{
InitializeControllerFactory();
AreaRegistration.RegisterAllAreas();
RouteConfiguration.RegisterRoutes();
}
Controller usine
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
IController result = null;
if (controllerType != null)
{
result = ObjectFactory.GetInstance(controllerType)
as IController;
}
return result;
}
Alors, quand je frappe/Accueil/Index, il passe dans le type de contrôleur correct. Lorsque je clique sur/Framed/Home/Index, controllerType est null, erreurs qui ne sont pas renvoyées.
C'est comme si MVC ignorait complètement ma zone. Que se passe t-il ici? Qu'est-ce que je fais mal?