【问题标题】:When we use areas where routing should be placed - asp mvc当我们使用应该放置路由的区域时——asp mvc
【发布时间】:2012-02-11 12:19:36
【问题描述】:

如果我们在一个项目中有多个区域,路由值应该存储在哪里。 什么应该去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 方法中输入。
我不明白为什么这种路由在第一种情况下有效,而在另一种情况下无效。有什么想法吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing


    【解决方案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 中。

    【讨论】:

    • 您好,感谢您的帮助。我用一个具体细节更新了问题,这让我对路由中应该去哪里感到困惑。请检查一下。
    • 你的区域路由需要像"CityPage/{controller}/{action}/{id}", // URL with parameters这样的区域名称前缀
    • 所以如果我所有的应用程序代码都在区域中,我不必在 global.asax 中放置任何路由参数?如果用户通过身份验证,我被放置在 global.asax 中应该打开页面的路由。
    • 我不确定您是否可以将所有路线放在一个文件中。我一直将我的区域相关路线放在区域内的文件中,并将我的根路线放在 global.asax
    【解决方案2】:

    根据您的描述。我认为您的 CityPage 区域上的链接与模式不匹配 area/controller/action 相反,它匹配controller/action,在你的情况下,country/city

    当你在 global.ascx 中有“CityPage_home”时,它会匹配第一个路由,action 等于“home”,action 等于“index”。您的网址中的值将分配给countrycity

    但是如果您将路线“CityPage_home”移动到CityPageAreaRegistration.cs,那么default 路线将被选中。因为global.ascx中的路由会先被查找,此时默认区域为CityPage

    @Nick 很好地介绍了带区域的路由

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 2015-08-04
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多