2010-08-12 4 views
9

Si j'ai une route comme ceci:Paramètre de routage optionnel avec contrainte dans ASP.NET MVC 2?

routes.Add(new Route("{controller}/{page}", 
    new RouteValueDictionary 
    { 
     { "page", UrlParameter.Optional } 
    }, 
    new RouteValueDictionary 
    { 
     { "page", @"[Pp]age\d+" } 
    }, 
    new MvcRouteHandler() 
)); 

Ensuite, l'itinéraire ne correspond pas quand {page} est manquante, si je supprime la contrainte qu'il correspond. Est-ce un bug ou une fonctionnalité?

Répondre

7

C'est une caractéristique: comment la contrainte peut-elle correspondre si le paramètre est optionnel? Vous pouvez soit définir la valeur par défaut de "page" sur "Page1" pour résoudre votre problème, ou remplacer votre expression régulière par "([Pp] age \ d +)?" pour ne rien permettre de faire correspondre (je ne suis pas sûr de celui-ci et ne peut pas le tester atm).

+1

Merci, en définissant une valeur par défaut au lieu de UrlParameter.Optional a fait l'affaire. Changer l'expression rationnelle n'a pas fonctionné. – ciscoheat

+0

Etes-vous sûr que l'expression rationnelle ne fonctionne pas? Ça marche pour moi. –

8

J'utilise ^$ | dans une regex, telle que: (^ $ | [Pp] age \ d +). J'ai trouvé cette question en cherchant une réponse à cela et j'ai pensé que j'ajouterais ce que j'ai trouvé ici.

routes.MapRoute(
    name: "News Archive", 
    url: "News/{page}", 
    defaults: new { controller = "news", action = "List", page= UrlParameter.Optional }, 
    constraints: new { page= @"^$|[0-9][0-9]" });