ASP.NET MVCを使用した複数のパラメーターによるルーティング


139

当社は自社製品のAPIを開発しており、ASP.NET MVCの使用を検討しています。APIを設計する際に、ユーザーがAPIからXML形式で情報をリクエストするために、以下のような呼び出しを使用することにしました。

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

ご覧のとおり、複数のパラメーターが渡されます(つまりartist、およびapi_key)。ASP.NET MVCでは、artistされるだろうcontrollergetImagesアクションが、どのように私はアクションに複数のパラメータを渡すのでしょうか?

これは上記のフォーマットを使用しても可能ですか?

回答:


279

アクションメソッドにパラメーターを追加するだけで、MVCでパラメーターが直接サポートされます。次のようなアクションがあるとします。

public ActionResult GetImages(string artistName, string apiKey)

次のようなURLが指定されると、MVCはパラメーターを自動入力します。

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

1つの追加の特殊なケースは、「id」という名前のパラメーターです。IDという名前のパラメータは、クエリ文字列ではなくパスに入れることができるため、次のようになります。

public ActionResult GetImages(string id, string apiKey)

次のようなURLが正しく入力されます。

/Artist/GetImages/cher?apiKey=XXX

さらに、より複雑なシナリオがある場合は、MVCがアクションを見つけるために使用するルーティングルールをカスタマイズできます。global.asaxファイルには、カスタマイズ可能なルーティングルールが含まれています。デフォルトでは、ルールは次のようになります。

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

次のようなURLをサポートしたい場合

/Artist/GetImages/cher/api-key

次のようなルートを追加できます:

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

上記の最初の例のような方法。


1
.NET 4とMVCを使用しています。パスで渡すことができるパラメーターは1つだけです。このURL {controller} / {action} / {artistName} / {apikey}は2つのパラメーターにマップされませんが、404エラーをトリガーします。私が知る限り、パスで渡すことができるパラメーターは1つだけです。何が悪いのですか?
DavidHyogo 2013

1
@DavidHyogo-同じ問題が発生していました。なんらかの理由で、デフォルトのアクションを指定したとしても、コントローラーやパラメーターだけでなく、実際に必要なアクションをHTMLリンクに配置する必要がありました。
Shaggy13spe 2013

5
@DavidHyogo:同じ問題があり、ルートテンプレートパラメータがアクションメソッドのパラメータ名と完全に一致している必要があることを発見しました。 public ActionResult MyMethod(string artistName、string apikey)
Sudhanshu Mishra

6
また、カスタムルートに到達する前に、URLがデフォルトルートに引っ掛からないことを確認してください。定義方法に基づいて、最初の一致を使用します。私の場合、デフォルトのインデックスにルート「MyController / {year} / {month}」を使用しようとしましたが、ルート{controller} / {action} / {id}が私のURL(MyController / 2015 / 04)、2015という名前のアクションが存在しなかったため、404を取得していました。カスタムルートを一番上に移動すると、問題が解決しました。
Sam

routeconfigのパラメータ名は、それが働いていなかった理由です、私のアクション署名を、一致しなかった、私は@dotnetguyで説明した手順に従い、それが働いた
pepitomb

26

MVC 5以降では、属性ルーティングを使用して、URLパラメーター構成をコントローラーに移動することもできます。

詳細については、こちらをご覧ください:http : //blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

概要:

まず、属性ルーティングを有効にします

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

         routes.MapMvcAttributeRoutes();
     } 
 }

次に、属性を使用して、パラメーターとオプションでデータ型を定義できます。

public class BooksController : Controller
{
    // eg: /books
    // eg: /books/1430210079
    [Route("books/{isbn?}")]
    public ActionResult View(string isbn)

5
ASP.NET Core MVCでの属性ルーティングについては、docs.microsoft.com / en
Bernard Vander

21

クエリ文字列を介して任意のパラメーターを渡すことができますが、RESTfulな方法でそれを処理するカスタムルートを設定することもできます。

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

それは:

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

したがって、誰かが次のルートを使用した場合:

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

それはあなたの例のクエリ文字列と同じ場所にそれらを連れて行くでしょう。

上記は単なる例であり、ユーザーがURLを「ハッキング」しないようにするために設定する必要があるビジネスルールや制約は適用されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.