Невозможно понять маршрутизацию Asp.net MVC - PullRequest
1 голос
/ 12 декабря 2011

Я добавил следующий маршрут в мой файл 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 Ответ

1 голос
/ 12 декабря 2011

Вам необходимо зарегистрировать вашу админку.

Когда я регистрировал маршруты для областей, я всегда делал это так:

Внутри папки 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), поскольку в дальнейшем это будет намного проще.

Пожалуйста, попробуйте это и дайте мне знать, если это работает: -)

...