Простая задача маршрутизации MVC - PullRequest
1 голос
/ 26 января 2010

У меня есть несколько страниц, которые очень похожи на другие, но одна из них не работает.

Когда я пишу 'http://localhost:2265/Segment/', я получаю раздражающее сообщение об ошибке "Ошибка сервера в" / "приложении. Ресурс не найден. "

Другие страницы, такие как 'http://localhost:2265/User/', работают очень хорошо, а также' http://localhost:2265/Segment/Create'. Так что проблема заключается в индексе сегмента. Я использовал ASP.NET Routing Debugger, и на других страницах я получаю правильные сопоставления, но я получаю то же самое сообщение об ошибке «ресурс не может быть найден» также при использовании отладчика ... Я думаю, это указывает на то, что маршрут по умолчанию не перехватывает его. .

Есть идеи?

Вот мои команды MapRoute.

            routes.MapRoute(
            "Maintenance",
            "Maintenance/{action}",
            new { controller = "Maintenance", action = "Index", id = "" }
        );

        routes.MapRoute(
            "User",
            "User/{action}",
            new { controller = "User", action = "Index", id = "" }
        );

        routes.MapRoute(
            "Segment",
            "Segment/{action}",
            new { controller = "Segment", action = "Index", id = "" }
        );

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

Обновление:

Спасибо за быстрый ответ!

Я удалил все маршруты, кроме стандартных. Это не решило проблему, но теперь список маршрутов стал короче.

В моем файле контроллера есть другие классы, такие как:

public class SegmentFormViewModel
{
}

public class SegmentController : Controller
{
}

public class SegmentFormCreateModel : Segment
{
}

Я пытался переместить его в контроллер, но это тоже не помогло.

Есть ли способ отладить эту проблему?

Обновление:

Вот мой контроллер (без содержания методов)

public class SegmentController : Controller
{
    //
    // GET: /Segment/

    public ActionResult Index()
    {
    }

    //
    // GET: /Segment/Details/5

    public ActionResult Details(Guid id)
    {
    }

    //
    // GET: /Segment/Create

    public ActionResult Create()
    {
    }

    //
    // POST: /Segment/Create

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(FormCollection collection)
    {
    }

    //
    // GET: /Segment/Edit/5

    public ActionResult Edit(int id)
    {
    }

    //
    // POST: /Segment/Edit/5

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, FormCollection collection)
    {
    }
}

Ответы [ 2 ]

4 голосов
/ 26 января 2010

Для совпадения с вашим / Segment / route вам потребуется класс контроллера «SegmentController», чтобы иметь действие «Index», которое принимает запросы GET, то есть не ограничено [AcceptVerbs(HttpVerbs.Post)].

Как уже прокомментировал Дарин, маршрут по умолчанию будет обрабатывать все остальные маршруты, которые вы добавили, поэтому вам не нужны дополнительные маршруты.

После обновления:
Возможно, ваша проблема связана с действиями в контроллере сегмента. Неважно, какие классы у вас есть в каком файле. Какие действия вы выполняете в контроллере сегмента?

После 2-го обновления:
Ваши действия выглядят нормально, поэтому я подозреваю, что проблема в коде, которого вы не указали.
Следующие шаги:
1. Используйте уже упомянутый отладчик маршрутизатора.
2. Загрузите исходный код MVC, чтобы пройти через него.
Последнее средство: запустите новый проект и добавьте только контроллер сегмента. Затем продолжайте добавлять связанный код, пока не найдете проблему.

2 голосов
/ 26 января 2010

Использование Phil Haack's RouteDebugger . Он скажет вам, что было найдено, что часто довольно быстро решает проблему.

Это действительно легко настроить: поместите RouteDebug.dll в папку / bin и внесите это изменение в событие запуска приложения:

protected void Application_Start(object sender, EventArgs e)
{
  RegisterRoutes(RouteTable.Routes);
  RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
}
...