Routing mit mehreren Parametern mit ASP.NET MVC

139

Unser Unternehmen entwickelt eine API für unsere Produkte und wir denken über die Verwendung von ASP.NET MVC nach. Beim Entwerfen unserer API haben wir beschlossen, Aufrufe wie den folgenden zu verwenden, damit der Benutzer Informationen von der API im XML-Format anfordert:

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&api_key=b25b959554ed76058ac220b7b2e0a026

Wie Sie sehen können, werden mehrere Parameter übergeben (dh artistund api_key). In ASP.NET MVC, artistwären die controller, getImagesdie Aktion, aber wie würde ich mehrere Parameter an die Aktion übergeben?

Ist das mit dem obigen Format überhaupt möglich?

CodingWithoutComments
quelle

Antworten:

279

Parameter werden in MVC direkt unterstützt, indem Sie Ihren Aktionsmethoden einfach Parameter hinzufügen. Bei einer Aktion wie der folgenden:

public ActionResult GetImages(string artistName, string apiKey)

MVC füllt die Parameter automatisch aus, wenn eine URL wie folgt angegeben wird:

/Artist/GetImages/?artistName=cher&apiKey=XXX

Ein weiterer Sonderfall sind Parameter mit dem Namen "id". Jeder Parameter mit dem Namen ID kann in den Pfad und nicht in den Querystring eingefügt werden.

public ActionResult GetImages(string id, string apiKey)

würde korrekt mit einer URL wie der folgenden ausgefüllt werden:

/Artist/GetImages/cher?apiKey=XXX

Wenn Sie kompliziertere Szenarien haben, können Sie außerdem die Routing-Regeln anpassen, die MVC zum Auffinden einer Aktion verwendet. Ihre global.asax-Datei enthält Routing-Regeln, die angepasst werden können. Standardmäßig sieht die Regel folgendermaßen aus:

routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

Wenn Sie eine URL wie unterstützen möchten

/Artist/GetImages/cher/api-key

Sie können eine Route hinzufügen wie:

routes.MapRoute(
            "ArtistImages",                                              // Route name
            "{controller}/{action}/{artistName}/{apikey}",                           // URL with parameters
            new { controller = "Home", action = "Index", artistName = "", apikey = "" }  // Parameter defaults
        );

und eine Methode wie das erste Beispiel oben.

Ryan Brunner
quelle
1
Ich arbeite mit .NET 4 und MVC. Ich kann nur einen Parameter im Pfad übergeben. Diese URL {controller} / {action} / {artistName} / {apikey} ist für mich nicht 2 Parametern zugeordnet, sondern löst einfach einen 404-Fehler aus. Soweit ich das beurteilen kann, können Sie nur 1 Parameter im Pfad übergeben. Was mache ich falsch?
DavidHyogo
1
@ DavidHyogo - Ich hatte das gleiche Problem. Aus welchem ​​Grund auch immer, obwohl ich die Standardaktion angegeben habe, musste ich tatsächlich die gewünschte Aktion in meinen HTML-Link einfügen, nicht nur den Controller und die Parameter.
Shaggy13spe
5
@DavidHyogo: Ich hatte das gleiche Problem und stellte fest, dass Ihre Routenvorlagenparameter genau mit den Parameternamen der Aktionsmethode übereinstimmen müssen, z. B. für die als {controller} / {action} / {artistName} / {apikey} definierte Route sollte die Aktionsmethode die Signatur haben public ActionResult MyMethod (string artistName, string apikey)
Sudhanshu Mishra
6
Stellen Sie außerdem sicher, dass Ihre URL nicht von der Standardroute erfasst wird, bevor sie Ihre benutzerdefinierte erreicht. Es wird die erste Übereinstimmung basierend auf Ihrer Definition verwendet. In meinem Fall habe ich versucht, die Route "MyController / {Jahr} / {Monat}" als Standard für den Index zu verwenden, aber die Route {Controller} / {Aktion} / {ID} stimmte mit meiner URL überein (MyController / 2015) / 04), also bekam ich eine 404, weil es keine Aktion mit dem Namen 2015 gab. Das Verschieben meiner benutzerdefinierten Route nach oben hat das Problem behoben.
Sam
Der Parametername in der Routenkonfiguration stimmte nicht mit meiner Aktionssignatur überein. Deshalb funktionierte er nicht. Ich habe die von @dotnetguy beschriebenen Schritte befolgt und es hat funktioniert
Pepitomb
26

Ab MVC 5 können Sie auch das Attribut-Routing verwenden, um die URL-Parameterkonfiguration auf Ihre Controller zu verschieben.

Eine ausführliche Diskussion finden Sie hier: http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

Zusammenfassung:

Zuerst aktivieren Sie das Attribut-Routing

 public class RouteConfig 
 {
     public static void RegisterRoutes(RouteCollection routes)
     {
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

         routes.MapMvcAttributeRoutes();
     } 
 }

Anschließend können Sie mithilfe von Attributen Parameter und optional Datentypen definieren

public class BooksController : Controller
{
    // eg: /books
    // eg: /books/1430210079
    [Route("books/{isbn?}")]
    public ActionResult View(string isbn)
Bernard Vander Beken
quelle
5
Das Attribut-Routing in ASP.NET Core MVC wird unter docs.microsoft.com/en-us/aspnet/core/mvc/controllers/…
Bernard Vander Beken am
21

Sie können beliebige Parameter über die Abfragezeichenfolge übergeben, aber Sie können auch benutzerdefinierte Routen einrichten, um diese REST-fähig zu behandeln:

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&
                                  api_key=b25b959554ed76058ac220b7b2e0a026

Das könnte sein:

routes.MapRoute(
    "ArtistsImages",
    "{ws}/artists/{artist}/{action}/{*apikey}",
    new { ws = "2.0", controller="artists" artist = "", action="", apikey="" }
    );

Wenn also jemand die folgende Route benutzt hat:

ws.audioscrobbler.com/2.0/artists/cher/images/b25b959554ed76058ac220b7b2e0a026/

Es würde sie an den gleichen Ort bringen, an dem sich Ihr Beispiel-Querystring befand.

Das Obige ist nur ein Beispiel und wendet nicht die Geschäftsregeln und -einschränkungen an, die Sie einrichten müssen, um sicherzustellen, dass die URL nicht von Personen "gehackt" wird.

George Stocker
quelle