Подтвердить что ты не робот

Как регистрировать области для маршрутизации

Я создал приложение MVC, имеющее 3 разных области. (Admin, Пользователь, Новости) Это мой файл RouteConfig.cs в каталоге App_Start:

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

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { "TestMvcApplication.Controllers" }
        );
    }
}

И это мой файл AdminAreaRegisteration.cs:

    namespace TestMvcApplication.Areas.Admin
{
    public class AdminAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Admin";
            }
        }

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

И, наконец, это мое содержимое файла Global.asax.cs:

namespace TestMvcApplication
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();
        }
    }
}

Главная страница моего сайта полностью загружена, и она работает. но Домашняя страница администратора или другие области не обнаруживаются по маршруту, и я дал это сообщение об ошибке:

Server Error in '/' Application.
The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly.

Requested URL: /Admin/Home

Как я могу решить эту проблему? Спасибо.

4b9b3361

Ответ 1

Вызовите AreaRegistration.RegisterAllAreas() где-нибудь в RegisterRoutes

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

Совет: Используйте инструмент, например RouteDebugger 2.0 или "Отладчик маршрутизации" , чтобы исследовать маршруты.

Получить последнюю версию NuGet: Отладчик маршрутов для MVC или RouteDebugger для WepApi

Вот учебник по Как настроить и использовать RouteDebugger с WebApi

Ответ 2

Из представленного кода я вижу 2 возможных вопроса:

  • Вы не вызываете RegisterAllAreas
  • Вы, кажется, не переопределяете свойство AreaName

Попробуйте изменить свой код на:

Global.asax

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    AreaRegistration.RegisterAllAreas();
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new[] { "TestMvcApplication.Controllers" }
    );
}

Область администратора

public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Admin";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Ответ 3

Просто создайте статическое имя класса AreaConfig со статическим методом RegisterAreas() здесь код:

public static class AreaConfig
{
    public static void RegisterAreas()
    {
        // 
        // Admin area . . .

        var adminArea = new AdminAreaRegistration();
        var adminAreaContext = new AreaRegistrationContext(adminArea.AreaName, RouteTable.Routes);
        adminArea.RegisterArea(adminAreaContext);


        // 
        // Default area . . .

        var defaultArea = new DefaultAreaRegistration();
        var defaultAreaContext = new AreaRegistrationContext(defaultArea.AreaName, RouteTable.Routes);
        defaultArea.RegisterArea(defaultAreaContext);
    }
}

затем вызовите его в файле Global.asax.cs следующим образом:

protected void Application_Start()
    {
        . . .

        AreaConfig.RegisterAreas();

        . . .
    }