Дополнительные параметры маршрута в ASP.NET 4 RTM больше не работают, как раньше - PullRequest
6 голосов
/ 13 апреля 2010

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

Ответы [ 2 ]

5 голосов
/ 17 апреля 2010

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

1 голос
/ 21 июня 2011

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

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

...