2016-07-02 12 views
1

Ich habe diesen Weg:Stellen ASP.NET MVC Route ID Parameter erforderlich

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

Diese Routen in diesem fein: mysite.com/place/details/123

machen Id 123 auf die Details verfügbar Aktion des Platz-Controllers - der dann nach '123' suchen kann.

jedoch - Diese URL wird auch an die Steuerung übergeben: mysite.com/place/details/

ich diese HttpNotFound zurückkehren wollen - aber es sendet eine Null-ID an die Steuerung - und erfordert mich zu handhaben Das.

Es scheint besser zu sein, wenn die Route selbst dies erreicht, anstatt unnötige Null-Checks im Controller selbst zu benötigen.

Ich habe in Google nichts zu diesem speziellen Problem gefunden.

Wie kann ich das tun?

+0

Als Referenz verwende ich jetzt nur Attribut-Routing - viel mehr Kontrolle, viel einfacher, um den Kopf zu bekommen. – niico

Antwort

5

Um die id Wert erforderlich zu machen, müssen Sie nicht legen Sie es als UrlParameter.Optional oder einen anderen Standardwert angeben. Ohne Wert im URL-Segment und ohne Vorgabe entspricht die Route nicht der Anfrage.

Aber Sie müssen wahrscheinlich auch die Route auf andere Weise einschränken, um zu verhindern, dass sie in Fällen übereinstimmt, in denen dies nicht der Fall ist.

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

Weitere Details und zusätzliche Optionen finden Sie unter Why map special routes first before common routes in asp.net mvc?.

2

Entfernen Sie die optional für die id Platzhalter in den Standardeinstellungen

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

Jetzt mysite.com/place/details/ wird die Strecke nicht überein. Vorausgesetzt, Sie haben keine andere Standardroute zugeordnet.

Wenn die oben genannten Konflikte mit Ihrem Routing macht, können Sie ändern es liek diese

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

koppelt diese Zuordnung direkt zu PlaceController.Details Aktion

Verwandte Themen