2010-04-02 4 views
3

J'ai une route comme suit, idéalement, je voudrais qu'il corresponde:ASP.NET MVC Route Contraints avec {ID} - {Slug} Format

domain.com/layout/1-slug-is-the -nom-de-la page

 routes.MapRoute(
      "Layout",            // Route name 
      "layout/{id}-{slug}",           // URL with parameters 
      new { controller = "Home", action = "Index"}, new {id = @"\d+$"} 
     ); 

Mais quand je frappe l'url, je suis continuer à faire cette exception:

le dictionnaire des paramètres contient une entrée nulle pour le paramètre « id » de non annulable tapez 'System.Int32' pour la méthode 'System.Web.Mvc.ActionResult Index (Int32)' dans ....

L'itinéraire ci-dessus correspondra à la suivante si:

domain.com/layout/1-slug ou domain.com/layout/1-slug_permalink

On dirait que le trait d'union qui sépare l'ID du Slug est causer des problèmes.

+0

Pouvez-vous utiliser une barre oblique à la place? "layout/{id}/{slug}" – mxmissile

+0

Je voudrais garder les choses simples et simuler une structure de site plus plate – TimLeung

Répondre

6

En tant que première étape de traitement, le module de routage effectue une correspondance de modèle de l'URL entrante par rapport à l'itinéraire déclaré. Cette correspondance de motif est désirée (donc l'id obtient tous les tirets jusqu'au dernier, ce qui marque le début du paramètre slug). Les contraintes (comme "\ d +") s'exécutent après la correspondance de modèle. Ce qui vous fait trébucher, c'est que la correspondance de type et donne une valeur invalide, alors elle échoue la contrainte, ce qui fait que la route globale ne correspond pas, donc le pipeline passe à essayer de faire correspondre la requête entrante à la suivante itinéraire dans la collection.

Le meilleur (par exemple plus facile à comprendre, non la ruse) façon de contourner c'est de faire correspondre l'ensemble du segment en tant que paramètre idAndSlug , utilisez une expression régulière appropriée dans le contrôleur pour diviser cette chaîne retourner dans son id et limace constituants.

Vous pouvez également utiliser la barre oblique comme suggéré par mxmissile.