Проблемы маршрута ASP.NET MVC 3 - PullRequest
2 голосов
/ 10 мая 2011

Я работаю над проектом http://mvcforum.codeplex.com.

У нас есть 2 зоны, Forum и ForumAdmin.

У меня есть несколько названных маршрутов, чтобы создать красивый URL с названиями форумов / тем в URL:

context.MapRoute("ShowTopic", "Forum/Topic/{id}/{title}", new { controller = "Topic", action = "Index" });
context.MapRoute("ShowForum", "Forum/Forum/{id}/{title}", new { controller = "Forum", action = "Index" });
context.MapRoute("ShowCategory", "Forum/Category/{id}/{title}", new { controller = "Category", action = "Index" });

context.MapRoute(
    "Forum_default",
    "Forum/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new string[] { "mvcForum.Web.Areas.Forum.Controllers" }
);

Так что это почти работает как задумано. Когда я просто просматриваю форум, все работает нормально, но когда мне нужно опубликовать тему (метод Create на контроллере темы), происходит сбой:

Словарь параметров содержит пустая запись для параметра 'id' из необнуляемый тип 'System.Int32' для метод 'System.Web.Mvc.ActionResult Index (Int32, System.String, Int32) 'в 'MvcForum.Web.Areas.Forum.Controllers.ForumController. Необязательный параметр должен быть ссылочный тип, обнуляемый тип или объявлен как необязательный параметр. Имя параметра: параметры

Что в большей или меньшей степени сводится к тому, чтобы не использовать метод Create, а выбрать метод Index.

Есть идеи, что я делаю не так? И какие маршруты я должен был иметь / не должен заставить это работать?

Заранее спасибо! Стин

1 Ответ

4 голосов
/ 10 мая 2011

URL Forum/Topic/Create попадет на маршрут Forum/Topic/{id}/{title}

Проблема в том, что маршруты Forum/Topic/{id}/{title} и Forum/{controller}/{action}/{id} в основном неразличимы (как ваш механизм маршрутов знает, что "Создать" не является "id для маршрута Темы?

Поэтому я не знаю лучшего способа, чем объявить каждое действие своим собственным маршрутом:

context.MapRoute("CreateTopic", "Forum/Topic/Create/", 
    new { controller = "Topic", action = "Create" });
context.MapRoute("ShowTopic", "Forum/Topic/{id}/{title}", 
    new { controller = "Topic", action = "Index" });
...