我有点问题。我有一个叫做框架的区域。这个区域有一个家庭控制器。该网站的默认设置也有一个家庭控制器。MVC 2.0,结构图,区域和重复的控制器名称
我想要做的是有适用于IFrame的每个控制器/操作的版本,以及是正常站点的版本。我通过母版页执行此操作,并且网站母版页拥有许多与框架版本不同的内容占位符。出于这个原因,我不能只交换母版页。例如,http://example.com/Framed/Account/Index将显示一个非常基本的版本,只有您的帐户信息用于外部网站。 http://example.com/Account/Index将显示相同的数据,但在默认站点内。
我的IoC容器是结构图。所以我找到了http://odetocode.com/Blogs/scott/archive/2009/10/19/mvc-2-areas-and-containers.aspx和http://odetocode.com/Blogs/scott/archive/2009/10/13/asp-net-mvc2-preview-2-areas-and-routes.aspx。这是我目前的设置。
Structuremap初始化
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", ""));
});
});
在这里,我通过调试中发现的问题是,由于该控制器具有相同的名称(HomeController中),它只注册了第一个,这是默认的主控制器。我有创意并附加了命名空间,以便它能够注册我的所有控制器。
默认路由
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" }
);
地区航线
context.MapRoute(
"Framed_default",
"Framed/{controller}/{action}/{id}",
new { area = "Framed", controller = "Home", action = "Index", id = UrlParameter.Optional },
new string[] { "MySite.Areas.Framed.Controllers" }
);
所推荐的Phil Haack,我使用的命名空间作为第四个参数
应用开始,只是为了证明初始化顺序
protected void Application_Start()
{
InitializeControllerFactory();
AreaRegistration.RegisterAllAreas();
RouteConfiguration.RegisterRoutes();
}
器厂
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
IController result = null;
if (controllerType != null)
{
result = ObjectFactory.GetInstance(controllerType)
as IController;
}
return result;
}
所以,当我打/首页/指数,它通过在正确的控制器类型。当我点击/ Framed/Home/Index时,controllerType为空,因为没有控制器被返回而出现错误。
就好像MVC完全忽略了我的区域一样。这里发生了什么?我究竟做错了什么?