ASP.NET MVC возвращение маршрута 404 без действий - PullRequest
5 голосов
/ 14 ноября 2009

Я работаю над очень простым приложением, использующим MVC2 Preview 1.

У меня есть контроллер с именем ContentController. Моя проблема в том, что / Content / Index работает правильно, но / Content / возвращает 404. Я запускаю приложение на Studio Development Server.

Протестировано с RouteDebugger, но / Content / возвращает 404 и не отображает отладочную информацию.

Я не изменил код маршрутизации:

       routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

Это мой контроллер:

public class ContentController : Controller
{
    IRepository _repo = new SimpleRepository("db", SimpleRepositoryOptions.RunMigrations);

    public ActionResult Index()
    {
        var content = _repo.GetPaged<Content>(0, 20);
        return View(content);
    }

Ответы [ 2 ]

7 голосов
/ 14 ноября 2009

Это выстрел в темноте, но есть ли у вас каталог с именем / Content /?

1 голос
/ 14 ноября 2009

/ Контент - это контроллер, представляющий собой просто набор действий. ASP.NET MVC нужно знать, КАКОЕ действие вы хотите выполнить, поэтому, пропуская действие asp.net, mvc не знает, какое действие вернуть, и выдает 404.

Вы можете указать его по умолчанию, добавив маршрут:

например:

routes.MapRoute("ContentDefault", "Content", new {controller = "Content", action = "Index"});

Атрибуты определены следующим образом:

'ContentDefault` : имя маршрута (должно быть уникальным в вашей таблице маршрутизации)

Контент: Сегмент URL (попробуйте изменить его на «Контент / Много / Длиннее / URL», а затем перейдите на http://localhost/Content/Much/Longer/URL, чтобы увидеть, как это работает)

new {controller = .., action = ...} : какой комбо-контроллер / действие нужно выполнить для этого маршрута.

Вы также можете переопределить действие HandleUnknownAction в вашем контроллере:

    protected override void HandleUnknownAction(string actionName)
    {
         return RedirectToAction("index");
    }

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

например. / Содержание / Большая / Longer / URL / {страница}

так что URL http://localhost/Content/Much/Longer/Url/999

передаст 999 в ваше действие в качестве атрибута страницы

public ActionResult Index(int Page) { }

Я люблю MVC - никогда не возвращаюсь к WebForms - так должна быть веб-разработка!

...