Контроллер MVC с именем Controllers выдает «Ошибка сервера в« / »приложении». - PullRequest
0 голосов
/ 12 мая 2011

Я использую ASP.NET MVC 3 (Razor) и создал контроллер с именем «Controllers» - в частности, имя класса Controller - «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 браузера?

Ответы [ 3 ]

2 голосов
/ 12 мая 2011

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

0 голосов
/ 12 мая 2011

По-видимому, проблема не имеет ничего общего с именем контроллера (т.е. 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 }
    );
}

Обратите внимание на пользовательские маршруты (называемые «Контроллеры») для маршрутов к HomeController (не ControllersController).

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

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

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

0 голосов
/ 12 мая 2011

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

"При всех соглашениях об именах в MVC я не удивляюсь, что Контроллер с именем Controllers вызывает странное поведение."

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

...