无法理解Asp.net MVC路由

时间:2011-12-12 11:23:44

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

我已将以下路由添加到我的global.asax文件中: -

routes.MapRoute(
    "Admin_Route",
    "Admin/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    new[] { "PriceCompare.Admin.Controllers" }
    );

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    new[] { "PriceCompare.Controllers" } 
    );

管理控制器,即 ManageCatsController,ManageBrandsController等驻留在 PriceCompare.Admin.Controllers 命名空间中,其他常规控制器位于 PriceCompare.Controllers 命名空间。

问题是,我可以通过在他们面前添加 Admin / 来访问所有控制器,无论他们是否在 PriceCompare.Admin .Controllers 命名空间。

此外,我可以直接访问管理控制器而无需为 Admin / 添加前缀。

为什么会这样。我误解了路由行为。

1 个答案:

答案 0 :(得分:1)

您需要注册管理区域。

当我为区域注册路线时,我总是这样做:

在App / Areas / Admin文件夹中创建一个包含此内容的AdminAreaRegistration.cs文件...

using System.Web.Mvc;
namespace AppName.Areas.Admin
{
    public class AdminAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Admin";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "Admin",
                "Admin/{controller}/{action}/{id}",
                new { controller="Home", action = "Index", id = UrlParameter.Optional },
                new string[] { "AppName.Areas.Admin.Controllers" }
            );
        }
    }
}

现在在Global.asax中执行此操作:

protected void Application_Start()
    {
        // Add this next line
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        // Add any other stuff (like IoC or whatever)
    }

仅在RegisterRoutes Global.asax中注册您的正常路线,如下所示:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
        new string[] { "AppName.Controllers" }
        );
 }

我还建议将Area部分保留在您的管理员命名空间内(因此在您的情况下将其称为PriceCompare.Areas.Admin.Controller),因为这样可以让以后的生活变得更轻松。

请尝试这个并让我知道它是否有效: - )