Контроллер MVC с именем Controllers выдает «Ошибку сервера в приложении ‘ /'».

#asp.net-mvc-3 #controller #naming-conventions

#asp.net-mvc-3 #контроллер #соглашения об именовании

Вопрос:

Я использую ASP.NET MVC 3 (Razor) и создали контроллер с именем «Controllers» — в частности, имя класса контроллера — «ControllersController».

Вот фрагмент моего контроллера «Controllers»:

 public class ControllersController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}
  

В дополнение к созданию класса ControllersController я создал Razor View (Index.cshtml), который коррелирует с действием ControllersController Index(). Возможно, стоит отметить, что я создал представление Index.cshtml, щелкнув правой кнопкой мыши метод Index () в контроллере и выбрав «Добавить представление».

Проблема, с которой я сталкиваюсь, заключается в том, что когда браузер пытается перейти к http://localhost/controllers выдается следующая ошибка:

Ошибка сервера в приложении ‘/’.

Ресурс не может быть найден. Описание: HTTP 404. Ресурс, который вы ищете (или одна из его зависимостей), мог быть удален, его имя было изменено или он временно недоступен. Пожалуйста, просмотрите следующий URL-адрес и убедитесь, что он написан правильно.

Запрошенный URL: /controllers/

Есть два момента, на которые я хотел бы обратить внимание:

  1. Ошибки можно избежать, если браузер явно перейдет к http://localhost/controllers/index
  2. Контроллеры, у которых нет имени ControllersController, не заставляют браузер указывать действие /index в своем URL.

Учитывая все соглашения об именовании в MVC, я не удивлен, что контроллер с именем Controllers вызывает какое-то странное поведение. Мой вопрос в том, что мне нужно сделать, чтобы мне не нужно было указывать / индексировать в URL браузера?

Ответ №1:

Это потому, что у вас на диске в вашем проекте есть папка с именем «Controllers». Одним из вариантов было бы переименовать эту папку во что-то другое. Эта проблема не будет существовать при публикации вашего сайта с использованием опции публикации Visual Studio, поскольку папка Controllers не будет загружена. Вторым, более громоздким решением было бы установить routes.RouteExistingFiles = true; в RegisterRoutes функции в вашем global.asax.cs. Затем вы можете захотеть вызвать route.Игнорирование маршрутов для элементов в вашей папке содержимого и т.д.

Комментарии:

1. вау, ты спас мой день!!! у меня был контроллер ProductsController и папка с именем Products, а в папке продукта у меня были вложенные папки с идентификаторами продуктов, и в каждой папке продукта у меня были статические файлы, относящиеся к продукту, и эта структура проекта доставляла мне кучу проблем, пока я не добавил маршруты. RouteExistingFiles = true спасибо, ребята!

Ответ №2:

Избегайте использования любых текущих имен в вашем коде — мир станет лучше, дети не будут плакать и т.д.

«Учитывая все соглашения об именовании в MVC, я не удивлен, что контроллер с именем Controllers вызывает какое-то странное поведение «.

Если это кажется странным — не делайте этого : )

Ответ №3:

По-видимому, проблема не имеет ничего общего с именем контроллера (т.е. ControllersController), а скорее с именем URL-маршрута.

В моем Global.asax.cs я добавил пользовательский маршрут следующим образом:

 public static void RegisterRoutes(RouteCollection routes)
{
    //Route /controllers/ to /Home/Index
    routes.MapRoute(
        "Controllers",
        "controllers/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}
  

Обратите внимание, что пользовательский маршрут (с именем «Controllers») направляется к HomeController (не ControllersController).

Я ожидал бы, что когда браузер указывает на http://localhost/controllers, MVC вернул бы страницу / Home / Index. Вместо этого выдается ошибка 404. Однако маршрут завершается успешно, если браузер указывает на http://localhost/controllers/index. — Это те же симптомы, о которых я упоминал в начале этого поста.

Основываясь на этом тесте, я думаю, можно с уверенностью предположить, что проблема не в соглашении об именовании контроллера, а скорее в соглашении об именовании маршрутизации MVC.

Чтобы продолжить создание моего приложения, я собираюсь изменить имя моего ControllersController на ControllerSystemsController. Тем временем мне интересно конкретно узнать, почему маршрутизатор MVC не работает должным образом для маршрутов, которые используют «controllers» в качестве имени контроллера. Кто-нибудь может пролить свет на это?