Routing z wieloma parametrami przy użyciu ASP.NET MVC

139

Nasza firma rozwija API dla naszych produktów i myślimy o wykorzystaniu ASP.NET MVC. Projektując nasze API, zdecydowaliśmy się na użycie wywołań takich jak to poniżej, aby użytkownik zażądał informacji z API w formacie XML:

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

Jak widać, przekazywanych jest wiele parametrów (tj. artistI api_key). W ASP.NET MVC, artistbyłoby controller, getImagesdziałania, ale jak chciałbym przekazać wiele parametrów do działania?

Czy jest to w ogóle możliwe przy użyciu powyższego formatu?

Kodowanie bez komentarzy
źródło

Odpowiedzi:

279

Parametry są bezpośrednio obsługiwane w MVC, po prostu dodając parametry do metod akcji. Biorąc pod uwagę akcję podobną do poniższej:

public ActionResult GetImages(string artistName, string apiKey)

MVC automatycznie wypełni parametry po otrzymaniu adresu URL, takiego jak:

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

Dodatkowym specjalnym przypadkiem są parametry o nazwie „id”. Dowolny parametr o nazwie ID można umieścić w ścieżce, a nie w zapytaniu, więc coś takiego:

public ActionResult GetImages(string id, string apiKey)

zostanie poprawnie wypełniony adresem URL takim jak ten:

/Artist/GetImages/cher?apiKey=XXX

Ponadto, jeśli masz bardziej skomplikowane scenariusze, możesz dostosować reguły routingu, których MVC używa do lokalizowania akcji. Twój plik global.asax zawiera reguły routingu, które można dostosować. Domyślnie reguła wygląda następująco:

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

Jeśli chcesz obsługiwać adres URL, taki jak

/Artist/GetImages/cher/api-key

możesz dodać trasę taką jak:

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

i metodę taką jak w pierwszym przykładzie powyżej.

Ryan Brunner
źródło
1
Pracuję z .NET 4 i MVC. W ścieżce mogę przekazać tylko jeden parametr. Ten adres URL {controller} / {action} / {artistName} / {apikey} nie jest dla mnie mapowany na dwa parametry, ale po prostu wywołuje błąd 404. O ile wiem, w ścieżce można przekazać tylko 1 parametr. Co ja robię źle?
DavidHyogo,
1
@DavidHyogo - miałem ten sam problem. Z jakiegoś powodu, mimo że określiłem akcję domyślną, musiałem faktycznie umieścić akcję, którą chciałem, w moim linku html, a nie tylko kontroler i parametry.
Shaggy13spe
5
@DavidHyogo: Miałem ten sam problem i odkryłem, że parametry szablonu trasy muszą dokładnie odpowiadać nazwom parametrów metody akcji, np. Dla trasy zdefiniowanej jako {controller} / {action} / {artistName} / {apikey} metoda akcji powinna mieć podpis public ActionResult MyMethod (string artistName, string apikey)
Sudhanshu Mishra
6
Upewnij się również, że Twój adres URL nie zostanie przechwycony przez domyślną trasę, zanim dotrze do niestandardowej. Użyje pierwszego dopasowania na podstawie tego, jak je zdefiniowałeś. W moim przypadku próbowałem użyć trasy „MyController / {year} / {month}” jako domyślnej wartości Index, ale trasa {controller} / {action} / {id} pasowała do mojego adresu URL (MyController / 2015 / 04), więc otrzymywałem 404, ponieważ nie istniała żadna akcja o nazwie 2015. Przeniesienie mojej niestandardowej trasy na górę rozwiązało problem.
Sam
Nazwa parametrów w routeconfig nie pasowała do mojego podpisu Action, dlatego nie działała, postępowałem zgodnie z krokami opisanymi przez @dotnetguy i zadziałało
pepitomb
26

Począwszy od MVC 5, możesz również użyć routingu atrybutów, aby przenieść konfigurację parametrów adresu URL do kontrolerów.

Szczegółowa dyskusja jest dostępna tutaj: http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

Podsumowanie:

Najpierw włącz routing atrybutów

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

         routes.MapMvcAttributeRoutes();
     } 
 }

Następnie możesz użyć atrybutów do zdefiniowania parametrów i opcjonalnie typów danych

public class BooksController : Controller
{
    // eg: /books
    // eg: /books/1430210079
    [Route("books/{isbn?}")]
    public ActionResult View(string isbn)
Bernard Vander Beken
źródło
5
Routing atrybutów w ASP.NET Core MVC opisano pod adresem docs.microsoft.com/en-us/aspnet/core/mvc/controllers/ ...
Bernard Vander Beken
21

Możesz przekazać dowolne parametry przez ciąg zapytania, ale możesz również skonfigurować niestandardowe trasy, aby obsłużyć je w sposób REST:

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

To mogłoby być:

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

Więc jeśli ktoś skorzystał z następującej trasy:

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

To doprowadziłoby ich do tego samego miejsca, co twój przykładowy querystring.

Powyższe jest tylko przykładem i nie stosuje reguł biznesowych i ograniczeń, które musisz skonfigurować, aby upewnić się, że ludzie nie „włamują” adresu URL.

George Stocker
źródło