2010-10-21 6 views
5

Wir versuchen, benutzerdefinierte Routen in einer ASP.NET MVC-Anwendung zu verwenden, um diese URL zu generieren: 'http://example.com/Person/unnecessaryinfo-42'. Die "unnötige Information" ist der Name der ID, die die URL für den Benutzer hackbar macht. Unten ist der Code für unsere Routenkarte. Dies funktioniert, aber meine Controller-Aktion endet mit "unnötige Information-42" im ID-Parameter. Kann ich das "unnötige info-" entfernen, bevor es die Controlleraktion erreicht?Wie entferne ich unnötige Informationen von einer benutzerfreundlichen URL, bevor es zu einer Controlleraktion kommt

routes.MapRoute("person_id", "person/{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"unnecessaryinfo-\d" }); 

Edit:

hier unsere neuesten Code:

routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"[\d]{1,6}" }); 

Das Kapitel über Routing von ASP.NET MVC 2 In Action (Seite 234) diskutiert die Verwendung von Datenbank-IDs, wann immer möglich zu vermeiden, aber wenn Sie müssen sie verwenden , Hinzufügen zusätzlicher Informationen, um die URL lesbar zu machen. Das versuchen wir (erfolglos). Die Datenbank-ID reicht derzeit von 1 bis 6 Ziffern (und kann mit der Zeit zunehmen).

Antwort

5

Ihr hin und her auf Darin's answer macht mich glauben, dass Sie wahrscheinlich eine andere Route haben, die werden abgestimmt ist und anstelle dieser Route verwendet:

routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"[\d]{1,6}" }); 

die Reihenfolge Umschalten in dem die Wege zum RouteCollection hinzugefügt werden sollte das Problem lösen. Spezifischere Routen sollten als erstes zur Sammlung hinzugefügt werden. Zum Beispiel, wenn Sie haben auch diesen Weg: zu

routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"[\d]{1,6}" }); 

routes.MapRoute("person_login", "person/{id}", 
    new { controller = "Customer", action = "Details" }); 

Die URL Ihr bereitgestellt 'http://example.com/Person/unnecessaryinfo-42' passt auf:

routes.MapRoute("person_login", "person/{id}", 
    new { controller = "Customer", action = "Details" }); 

es nach Ihrer spezielleren „person_id“ Route so Ihr Code würde wie folgt aussehen erscheinen soll Beide Routen, aber da Ihre spezifischere Route zuerst angezeigt wird, wird diese Route verwendet. Wenn eine weniger spezifische URL zugeordnet wird, stimmt sie nicht mit der ersten überein, und daher wird die zweite Route verwendet.

Das Bestimmen, welche Routen eine URL übereinstimmt, kann ein bisschen schwierig sein. Zum Glück gibt es zwei ziemlich gute Optionen, die mit Route Debuggen unterstützen:

Stephen Lösung URL Routing Debugger

  • Stephen Walther bietet eine Alternative zu implementieren ist wahrscheinlich das beste für die Langzeit verwenden, aber Phils ist definitiv die leichter zu implementieren für down und schmutzige Debugging. Ich würde damit beginnen, Ihre Routen neu zu ordnen, aber wenn das das Problem nicht löst, verwenden Sie einen der oben genannten Debugger.

  • 3
    routes.MapRoute(
        "person_id", 
        "person/{unnecessaryinfo}-{id}", 
        new { controller = "Customer", action = "Details" }, 
        new { id = @"\d" } 
    ); 
    

    Sie könnten auch einige regex Einschränkung in der unnecessaryinfo Route Token hinzufügen.

    +0

    Ich habe genau das, was Sie oben haben, versucht und es gibt mir immer noch "unnötige Info-ID" am Controller. Ich verstehe auch nicht, was Sie mit "Sie können auch einige Regex-Einschränkung in der unnötigen Info-Route-Token hinzufügen." – rkgallegos

    +0

    Welche URL verwenden Sie? '~/customer/details/foobarunnecessary-5' und' public ActionResult Details (String-ID) 'ergeben in dieser Controller-Aktion' id = 5'.Beachten Sie auch, dass '\ d 'eine ** einzelne ** Ziffer bedeutet. Wenn Sie '~/customer/details/foobarunnecessary-123' verwenden und immer noch die Standardroute am Ende haben (' {controller}/{action}/{id} '), passt diese Standardroute und nicht Ihre benutzerdefinierte Route und Sie erhalten in Ihrer Controller-Aktion "id = foobarunnecessary-123". –

    +0

    Die End-URL, zu der wir gelangen möchten, ist ~/Person/unnötigeinfo-42 und die Anzahl der Ziffern variiert und kann zwischen 1 und 6 oder mehr liegen. – rkgallegos

    Verwandte Themen