it-swarm.com.de

Routing mit mehreren Parametern unter Verwendung von ASP.NET MVC

Unser Unternehmen entwickelt eine API für unsere Produkte und denkt darüber nach, ASP.NET MVC zu verwenden. Bei der Entwicklung unserer API haben wir uns dazu entschlossen, 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, werden mehrere Parameter übergeben (d. H. artist und api_key). In ASP.NET MVC wäre artist die Aktion controller, getImages, aber wie würde ich der Aktion mehrere Parameter übergeben?

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

129

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

public ActionResult GetImages(string artistName, string apiKey)

MVC füllt die Parameter automatisch auf, 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 anstelle des Querystrings in den Pfad 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 Suchen einer Aktion verwendet. Ihre global.asax-Datei enthält Weiterleitungsregeln, die angepasst werden können. Standardmäßig sieht die Regel so 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 wollten

/Artist/GetImages/cher/api-key

sie könnten 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 ein Verfahren wie das erste Beispiel oben.

271
Ryan Brunner

Ab MVC 5 können Sie das Attributrouting auch 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 Attributrouting

 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)
22

Sie können beliebige Parameter über die Abfragezeichenfolge übergeben, aber Sie können auch benutzerdefinierte Routen einrichten, um REST-konform damit umzugehen:

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:

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

Es würde sie an dieselbe Stelle bringen, an der Ihr Beispiel-Querystring war.

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

21
George Stocker