Дополнительные параметры маршрута в 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, и все они работают нормально.


person Simon_Weaver    schedule 13.04.2010    source источник
comment
Если бы кто-нибудь мог проверить это в .NET 4 RC, я был бы очень признателен. Машинка у меня всего одна :-(   -  person Simon_Weaver    schedule 13.04.2010


Ответы (2)


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

person Darin Dimitrov    schedule 17.04.2010
comment
это был фреймворк 3.5 или 4.0? что-то точно изменилось, потому что я не менял версию mvc. и я действительно думал, что раньше тестировал необязательный, но на самом деле он отображал UrlParameter.Optional для выходного URL. спасибо за тестирование. я попробую еще раз - person Simon_Weaver; 18.04.2010
comment
Это был проект 4.0 Framework, который я создал с использованием шаблона Visual Studio. - person Darin Dimitrov; 18.04.2010

Я знаю, что вопрос касается MVC2, но в MVC3 ответ Дарина Димитрова не удастся.

Фил Хаак объяснил проблему и дал решение в своем блоге: http://haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspx

person Kunderemp    schedule 21.06.2011