#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/
Есть два момента, на которые я хотел бы обратить внимание:
- Ошибки можно избежать, если браузер явно перейдет к http://localhost/controllers/index
- Контроллеры, у которых нет имени 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» в качестве имени контроллера. Кто-нибудь может пролить свет на это?