2010-04-13 13 views
6

Zaktualizowałem mój projekt do ASP.NET 4 RTM dzisiaj z ASP.NET MVC 2.0 RTM.Opcjonalne parametry trasy w ASP.NET 4 RTM nie działają już tak jak wcześniej

Poprzednio używałem ASP.NET 3.5 z ASP.NET MVC 2.0 RTM.

Niektóre z moich tras nie działają nagle i nie wiem dlaczego. Nie jestem pewien, czy coś zmieniło się pomiędzy 3.5 a 4.0 - lub jeśli był to problem typu regresji w RTM 4.0. (Nigdy wcześniej nie testowałem mojej aplikacji z 4.0).

Lubię używać Url.RouteUrl("route-name", routeParams), aby uniknąć niejednoznaczności podczas generowania adresów URL. Oto moja definicja trasy dla strony galerii. Chcę, aby imageID było opcjonalne (jeśli go nie określisz, pojawi się strona z miniaturami).

// gallery id 
routes.MapRoute(
    "gallery-route", 
    "gallery/{galleryID}/{imageID}/{title}", 
    new { controller = "Gallery", action = "Index", 
      galleryID = (string) null, 
      imageID = (string) null, 
      title = (string) null} 
); 

W .NET 3.5/2.0 RTM ASP.NET/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 

W .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 

Wcześniej może dostarczyć tylko numer galleryID i wszystko inne zostanie zignorowane w wygenerowanym adresie URL. Ale teraz wygląda na to, że muszę określić wszystkie parametry aż do title - lub rezygnuje z określania adresu URL.

przychodzące adresy działać dobrze dla /gallery/cats i że jest prawidłowo odwzorowane dzięki tej reguły z imageID i title jest przypisany null zarówno w moim kontrolera.

Sprawdziłem również INCOMING trasy z http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx i wszystkie działają poprawnie.

+0

Jeśli ktoś mógłby to sprawdzić w .NET 4 RC bym naprawdę wdzięczny. Mam tylko jedną maszynę :-( –

Odpowiedz

5

Prawidłowy sposób określania parametrów opcjonalnych w ASP.NET MVC 2.0 jest przy użyciu pola UrlParameter.Optional:

routes.MapRoute(
    "gallery-route", 
    "gallery/{galleryID}/{imageID}/{title}", 
    new 
    { 
     controller = "Gallery", 
     action = "Index", 
     galleryID = UrlParameter.Optional, 
     imageID = UrlParameter.Optional, 
     title = UrlParameter.Optional 
    } 
); 

Zakładając następujące kontroler i działanie:

public class GalleryController : Controller 
{ 
    public ActionResult Index(string galleryID, string imageID, string title) 
    { 
     return View(); 
    } 
} 

Wszystko to będzie działać zgodnie z oczekiwaniami :

<%= 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" })%> 

Renderowanie jako:

/gallery/cats 
/gallery/cats/4 
/gallery/cats/4/tiddles 

Uwaga: Przetestowano na Windows 7 x64, Visual Studio 2010 RTM, projekt ASP.NET MVC 2.0.

+0

był to projekt ramowy 3.5 lub 4.0? Coś się zmieniło na pewno, ponieważ nie zmieniłem wersji mvc i faktycznie myślałem, że testowałem z opcjonalnym wcześniej, ale faktycznie miałem renderować UrlParameter. Opcjonalnie dla adresu URL ouput, dziękuję za przetestowanie go. Dam sobie jeszcze jedną próbę: –

+0

To było 4.0 Projekt ramowy, który utworzyłem przy użyciu szablonu Visual Studio. –

Powiązane problemy