Дополнительные параметры маршрута в ASP.NET 4 RTM больше не работают как прежде

Я обновил свой проект до 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, и они все хорошо работают.

6
задан Simon_Weaver 13 April 2010 в 21:00
поделиться

1 ответ

​​

Правильный способ указания необязательного параметры в 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.

5
ответ дан 17 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: