如果我们在一个项目中有更多区域,那么应该在哪里存储路由值。
应该转到Global.asax
以及AreaAreaRegistration.cs
中的课程内容
我不经常使用asp mvc(它仍然是业余爱好),但路由一直让我遇到问题:(
我必须举一个令我困惑的例子:
我有两个区域并链接在一个区域( CityPage ),它应该在另一个区域打开页面。
所以在global.asax
我有:
routes.MapRoute(
"CityPage_home",
"{country}/{city}",
new { controller = "Home", action = "Index", country = UrlParameter.Optional, city = UrlParameter.Optional }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { area = "CityPage", controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
这很有效。但是,如果我将“* CityPage_home *”从global.asax
移到CityPageAreaRegistration.cs
,那么当我点击应在另一个区域打开页面的链接时,我的应用程序会崩溃,因为代码首先在CityPage/Home/Index
方法中输入。登记/>
我不明白为什么这个路由在第一种情况下工作而在另一种情况下不工作。有什么想法吗?
答案 0 :(得分:1)
在每个区域内,将为您生成一个文件。例如。
AdminArea
将包含名为AdminAreaRegistration
的文件
使用这样的方法:
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
我想通过添加默认控制器来修改它。
传统上我们使用以下方法创建链接:
@Html.ActionLink("MyLink","Index","Home",)
要创建指向管理区域的链接,我们使用此链接:
@Html.ActionLink("Admin Area","Index", new { area = "Admin", controller = "Home" })
现在,如果您在管理员内部并希望放置指向主页的链接,则需要执行此操作:
@Html.ActionLink("Home","Index", new { area="", controller = "Home })
最后,如果您需要创建自定义路由,可以将区域路由放在每个区域内创建的新文件中,并继续将非区域特定路由放在正常的Global.asax中。
答案 1 :(得分:1)
根据您的描述。我认为您的CityPage区域上的链接与模式area/controller/action
不匹配
相反,它匹配controller/action
,在您的情况下,country/city
。
当你的global.ascx中有“CityPage_home”时,它匹配第一条路线,动作等于“home”,动作等于“index”。您网址中的值将分配到country
和city
。
但如果您将路线“CityPage_home”移至CityPageAreaRegistration.cs
,则会选择default
路线。因为global.ascx
中的路线将首先被查找,在这种情况下,区域为CityPage
,因为您将其设置为默认值。
@Nick为您提供了有关区域路由
的详细介绍