我有一点问题。我有一个叫做 Framed 的区域。这个区域有一个家庭控制器。该站点的默认设置还有一个家庭控制器。
我想要做的是有一个适合 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。这是我目前的设置。
结构图初始化
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),所以只注册了第一个,也就是默认的home控制器。我很有创意并附加了命名空间,以便它可以注册我所有的控制器。
默认路由
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的建议,我使用命名空间作为第四个参数
app start,只是为了证明初始化的顺序
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;
}
因此,当我点击 /Home/Index 时,它会传入正确的控制器类型。当我点击 /Framed/Home/Index 时,controllerType 为空,这是因为没有返回控制器而出错。
就好像 MVC 完全忽略了我的领域。这里发生了什么?我究竟做错了什么?