我有點問題。我有一個叫做框架的區域。這個區域有一個家庭控制器。該網站的默認設置也有一個家庭控制器。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完全忽略了我的區域一樣。這裏發生了什麼?我究竟做錯了什麼?