2016-07-02 1 views
1

J'ai cette route:Faire paramètre ASP.NET MVC Route Id requis

routes.MapRoute(
      "PlaceDetails", 
      "{controller}/{action}/{id}", 
      new { controller = "Place", action = "Details", id = UrlParameter.Optional } 
     ); 

Ce parcours ce beau: mysite.com/place/details/123

Faire Id 123 disponible pour les détails action du contrôleur de lieu - qui peut ensuite rechercher place '123'.

Cependant - cette URL est également transmise au contrôleur: mysite.com/place/details/

Je veux que ce retour HttpNotFound - mais il envoie un identifiant nul au contrôleur - et me oblige à gérer cette.

Il semble plus facile si la route elle-même réalise cela plutôt que d'avoir besoin de vérifications nulles dans le contrôleur lui-même.

Je n'ai rien trouvé dans Google à propos de ce problème spécifique.

Comment est-ce que je peux faire ceci?

+0

Pour référence, je n'utilise plus que le routage d'attribut - beaucoup plus de contrôle, bien plus facile à obtenir. – niico

Répondre

5

Pour rendre la valeur id nécessaire, vous ne devez pas définir comme UrlParameter.Optional ou fournir toute autre valeur par défaut. Sans valeur dans le segment d'URL et sans valeur par défaut, l'itinéraire ne correspondra pas à la demande.

routes.MapRoute(
    "PlaceDetails", 
    "{controller}/{action}/{id}", 
    new { controller = "Place", action = "Details" } 
); 

Mais vous devrez probablement contraindre la route d'une autre manière pour l'empêcher de correspondre dans les cas où elle ne le devrait pas.

routes.MapRoute(
    "PlaceDetails", 
    "Place/{action}/{id}", 
    new { controller = "Place", action = "Details" } 
); 

Voir Why map special routes first before common routes in asp.net mvc? pour plus de détails et d'options supplémentaires.

2

Retirez option pour l'espace réservé id dans les paramètres par défaut

routes.MapRoute(
     "PlaceDetails", 
     "{controller}/{action}/{id}", 
     new { controller = "Place", action = "Details"} 
    ); 

Maintenant mysite.com/place/details/ ne correspondra pas à la route. À condition que vous n'ayez pas mappé une autre route par défaut.

Si les causes ci-dessus en conflit avec votre routage, vous pouvez le modifier liek ce

routes.MapRoute(
     "PlaceDetails", 
     "Place/Details/{id}", 
     new { controller = "Place", action = "Details"} 
    ); 

qui accouple cette mise en correspondance directement à PlaceController.Details l'action