@skosterin88

Как запускать сайт на ASP .NET MVC из определенной области (area)?

Здравствуйте, господа и дамы (если таковые присутствуют).

Имеется проект на ASP .NET MVC 5. Он разделен на две области - Admin и Default. Задумка такая - все предназначенное для простых смертных - в области Default, админка - это, соответственно, область Admin.

Вот как регистрируются маршруты в области Default (DefaultAreaRegistration.cs):
public class DefaultAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "Default";
            }
        }

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

            
        }
    }


Вот содержимое файла RouteConfig.cs:

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

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

А это - мой Global.asax.cs:
public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            var adminArea = new AdminAreaRegistration(); 
            var adminAreaContext = new AreaRegistrationContext(adminArea.AreaName, RouteTable.Routes); 
            adminArea.RegisterArea(adminAreaContext);

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

            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }


Хочется сделать так, чтобы при старте приложения по умолчанию запускался метод Index контроллера HomeController из области Default. Т.е. чтобы URL-ы localhost:12345 и localhost:12345/Default/Home/Index были равнозначны.

Проблема вот в чем - при условиях, приведенных выше, когда я просто беру и запускаю проект, браузер выдает мне ошибку "Веб-сервер настроен таким образом, чтобы не формировать списка содержимого каталога" с комментарием "Эта ошибка происходит, когда документ не указан в URL-адресе, не указан применяемый по умолчанию документ для веб-сайта или приложения, и когда средства для отображения листинга каталога не активированы для веб-сайта или приложения. Эта настройка может быть отключена преднамеренно для защиты содержимого сервера."

Вопросы:

1) возможно ли реализовать задуманное средствами ASP .NET MVC 5?
2) если да, то что я делаю не так?
  • Вопрос задан
  • 412 просмотров
Решения вопроса 1
@skosterin88 Автор вопроса
Я решил вопрос.
Для тех, кому актуально - делается это так.

1) В файле RouteConfig.cs убираем все регистрации маршрутов.
2) В файле DefaultAreaRegistration.cs в области Default убираем слово "Default" из шаблонов URL при регистрации маршрутов. Должно получиться так:
public override void RegisterArea(AreaRegistrationContext context) 
        {
            context.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "InstrumentsStore.Areas.Default.Controllers" }
            );
            
            context.MapRoute(
                "Catalog",
                "{controller}/{action}/{id}",
                new { controller = "Catalog", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "InstrumentsStore.Areas.Default.Controllers" }
            );

            
        }


После этих изменений у меня все сработало так, как и было задумано.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы