Я обновил свой проект до ASP.NET 4 RTM
с ASP.NET MVC 2.0 RTM
сегодня.
Я ранее использовал ASP.NET 3.5
с ASP.NET MVC 2.0 RTM
.
Некоторые мои маршруты внезапно не работают, и я не знаю почему. Я не уверен, изменилось ли что-то между 3,5 и 4.0 - или если это было проблемой типа регрессии в 4.0 RTM. (Я никогда ранее протестировал свое приложение с 4,0).
Мне нравится использовать Url.RouteUrl("route-name", routeParams)
избегать неоднозначности при генерации URL. Вот мое определение маршрута для страницы галереи. Я хочу imageID
быть дополнительным (Вы получаете страницу миниатюры, если Вы не указываете его).
// gallery id
routes.MapRoute(
"gallery-route",
"gallery/{galleryID}/{imageID}/{title}",
new { controller = "Gallery", action = "Index",
galleryID = (string) null,
imageID = (string) null,
title = (string) null}
);
В.NET 3.5 / ASP.NET 2.0 RTM / IIS7
Url.RouteUrl("gallery-route", new { galleryID = "cats"})
=> /gallery/cats
Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4")
=> /gallery/cats/4
Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles")
=> /gallery/cats/4/tiddles
В.NET 4.0 RTM / ASP.NET 2.0 RTM / IIS7
Url.RouteUrl("gallery-route", new { galleryID = "cats"})
=> null
Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4")
=> /gallery/cats/4
Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles")
=> /gallery/cats/4/tiddles
Ранее я мог предоставить только galleryID
и все остальное было бы проигнорировано в сгенерированном URL. Но теперь похоже, что я должен указать все параметры вплоть до title
- или это сдается в определении URL.
Входящие URL хорошо работают для /gallery/cats
и это правильно отображается через это правило с imageID
и title
оба присваиваемый null
в моем контроллере.
Я также протестировал ВХОДЯЩИЕ МАРШРУТЫ с http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx, и они все хорошо работают.
Правильный способ указания необязательного параметры в ASP.NET MVC 2.0 используют поле UrlParameter.Optional :
routes.MapRoute(
"gallery-route",
"gallery/{galleryID}/{imageID}/{title}",
new
{
controller = "Gallery",
action = "Index",
galleryID = UrlParameter.Optional,
imageID = UrlParameter.Optional,
title = UrlParameter.Optional
}
);
Предполагая следующий контроллер и действие:
public class GalleryController : Controller
{
public ActionResult Index(string galleryID, string imageID, string title)
{
return View();
}
}
Все они будут работать, как ожидалось:
<%= Url.RouteUrl("gallery-route", new { galleryID = "cats" }) %><br/>
<%= Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4"}) %><br/>
<%= Url.RouteUrl("gallery-route", new { galleryID = "cats", imageID = "4", title = "tiddles" })%>
Визуализировать как:
/gallery/cats
/gallery/cats/4
/gallery/cats/4/tiddles
Примечание: протестировано на Windows 7 x64, Visual Studio 2010 RTM, проект ASP.NET MVC 2.0.