Почему этот маршрут не работает правильно? - PullRequest
2 голосов
/ 04 февраля 2010

Я серьезно схожу с ума от этого.

Вот что есть в моем Global.asax

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

Это единственные два маршрута, которые у меня есть.

Когда я пытаюсь получить доступ к

http://mysite/Blogs/Edit/1 не работает Я получаю эту ошибку

Словарь параметров содержит пустую запись для параметра id с ненулевым типом System.Int32 для метода System.Web.Mvc.ActionResult Details (Int32) в mysite.Controllers.BlogsController. Необязательный параметр должен быть ссылочным типом, обнуляемым типом или быть объявлен как необязательный параметр.

Почему это происходит?

Спасибо

Я также должен добавить свой код контроллера выглядит следующим образом

//
// GET: /Blogs/Edit/5

[Authorize]
public ActionResult Edit(int id)
{
  // do a bunch of stuff and return something
}

Ответы [ 2 ]

5 голосов
/ 04 февраля 2010

Попробуйте следующее

routes.MapRoute("BlogDetails", "Blogs/{id}/{title}",
 new { controller = "Blogs", action = "Details"},
 new { id = @"\d+" });

Что касается маршрутов MVC, {id} может быть чем угодно (даже строками), поэтому он соответствует Edit в виде строки, которая не может войти в int id вашего действия.

Добавление new { id= @"\d+" } в качестве дополнительного параметра указывает системе маршрутизации сопоставлять только числа.

http://www.asp.net/(S(pdfrohu0ajmwt445fanvj2r3))/learn/mvc/tutorial-24-cs.aspx

1 голос
/ 04 февраля 2010

2 ваших маршрута на самом деле " confilicting ", и в вашем случае первый маршрут выбирается вместо второго, как вы ожидаете.

Возможно, вам нужно изменить свои маршруты науберите неоднозначность:

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

Это определение будет четко различать: http://mysite/Blogs/Edit/1 и http://mysite/Blogs/1-first

или, как упомянул Бадди, попытаться добавить ограничение к маршруту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...