複数のオプションパラメータルーティング

アキルディーパック

私のwebapiプロジェクトには次のルート定義があります。パラメータの1つが渡されないという問題があります。例えば;

/ Controller / Action / param2 / startdate / enddateを呼び出すと、param2に渡した値がparam1に使用され、その逆も同様です。問題は、RoutingModuleが、指定されたルート値がparam1ではなくparam2にあることを検出できないことです。

URLでクエリ文字列を使用しているがクエリ文字列を使用したくない場合は機能します。あなたの助けに感謝。

私が期待することを達成する方法はありますか?

config.Routes.MapHttpRoute(
    name: "RetrieveHistory",
    routeTemplate: "{controller}/{action}/{param1}/{param2}/{startDate}/{endDate}",
    defaults: new
    {
        controller = "Vend",
        action = "RetrieveUtrnHistory",
        param1 = RouteParameter.Optional,
        param2 = RouteParameter.Optional,
        starDate = RouteParameter.Optional,
        endDate = RouteParameter.Optional
    });

ありがとう

JotaBe

問題を解決するには、次のことを考慮に入れる必要があります。

  • 複数のルートを登録できます。URLを処理できる最初に登録されたルートがそれを処理します。
  • /ルートの一部を区別できるようにするために、スラッシュ以外のものを区切り文字として使用できます
  • パラメータ制約(通常は正規表現)を使用して、パラメータが1つまたは他の種類であるかどうかを簡単に見つけられるようにすることができます。
  • パラメーターのデフォルト値を指定できます。その場合、actionメソッドにはパラメーターのデフォルト値が必要です(MVCを除き、パラメーターがnull可能または参照型である必要がある場合のみ)。

URLがどのように見えるかを教えてくれなかったので、私自身の例を紹介します。

次のTestControllerようなアクションを持つWebAPIControllerクラスがあるとします

// GET api/Test/TestAction/ ...
[HttpGet]
public object TestAction(int param1, DateTime startDate, DateTime endDate, 
                         int? param2 = null)
{
    return new
    {
        param1 = param1,
        param2 = param2,
        startDate = startDate,
        endDate = endDate
    }.ToString();
}

注:デフォルトルートでは、指定されたWebAPIコントローラーのメソッドGetXxxはHTTPGETで使用でき、指定されたメソッドPostXxxはHTTPPOSTで使用できます。しかし、一度あなたは、ControllerActionURLテンプレートでは、使用しなければならない[HttpXxx]必要なHTTPメソッドへのあなたの方法を利用できるように属性を。

中央のオプションのパラメータ

この最初の例ではparam1、とparam2両方とも整数でありstardDate、とendDateは日付であると想定しています。

http://myhost/api/Mycontroller/Myaction/12/22/2014-12-01/2014-12-31
http://myhost/api/Mycontroller/Myaction/22/2014-12-01/2014-12-31

最初のURLを次のようなパラメータに一致させる場合:

param1 = 12; param2 = 22; startDate = 2014-12-01; endData = 2014-12-31

そしてこれらのような2番目:

param1 = 12; param2 = null; startDate = 2014-12-01; endData = 2014-12-31

2つのルートを登録する必要があります。1つは可能な各URL構造に一致します。

// for the 1st
routeTemplate: "api/{controller}/{action}/{param1}/{param2}/{startDate}/{endDate}"
// for the 2nd
routeTemplate: "api/{controller}/{action}/{param1}/{startDate}/{endDate}"

この場合、両方のルートは相互に排他的であることに注意してください。つまり、単一のURLは一方のルートにのみ一致するため、他のルートに登録できます。

ただし、2番目のURLはの値を定義しておらずparam2TestActionメソッドがそれを必要としていることに注意する必要があります。これは機能しません。コントローラーのメソッドとルート登録の両方に、このパラメーターのデフォルト値を含める必要があります。

  • アクションパラメーターint? param2 = null(C#ではオプションのパラメーターを最後にする必要があります)。
  • ルートにはデフォルトが含まれている必要があります。 defaults: new { param2 = RouteParameter.Optional }

これは、真ん中の問題のオプションのパラメータを解決する方法です。一般に、オプションのパラメーターの数に応じていくつかのルートを定義し、WebAPIアクションメソッドでこのパラメーターをデフォルト値で宣言する必要があります。

注:上記で書いたように、MVCでは、これを機能させるためにメソッドパラメーターにデフォルト値を指定する必要はありません。

パラメータの制約

ルートパラメータに制約を指定すると、次の2つの結果が生じます。

  1. パラメータ値が期待される形式であるという保証があります
  2. 最も重要なことは、ルートは、フォーマットが予期されたものである場合にのみURLを処理することです。したがって、これはURLをより選択的にするのに役立ち、したがってより柔軟になります。

次のconstraintように、ルート登録にパラメータを追加するだけです

config.Routes.MapHttpRoute(
    name: "Multiparam2",
    routeTemplate: "api/{controller}/{action}/{param1}/{param2}/{startDate}/{endDate}",
    constraints: new
    {
        startDate = @"20\d\d-[0-1]?\d-[0-3]?\d", // regex
        endDate = @"20\d\d-[0-1]?\d-[0-3]?\d" // regex
    },
    defaults: new object { }
);

defaults空の場合でもパラメータを指定する必要があることに注意してください

注:この場合の制約は、20XX年の日付、1桁、または0xまたは1xで表される月、および1桁または0x、1x、2x、または3xで区切られた日付のみに一致する正規表現です。ダッシュで。したがって、この正規表現は一致します2012-1-12015-12-30ではなく1920-12-30必要に応じて正規表現を調整する必要があります。

最後のオプションパラメータ

この時点で、オプションのパラメーターをサポートする方法と、ルートテンプレートに一致するようにそれらの形式(制約)を指定する方法について説明しました。

オプションのパラメータを定義する通常の方法は、URLテンプレートの最後で行うことです。この場合、ルートにパラメータがない場合は、すべてルートの最後にある必要があります。(これを中央のオプションと比較してください:異なるルートが必要です)。

オプションのようにしたい場合は、この例では、param2と、startDateendDate、あなたはルート登録、及びアクションメソッドに設定されているデフォルトのパラメータ値でそれらを定義する必要があります。

最終的なコードは次のようになります。

[HttpGet]
public object TestAction(int param1, int? param2 = null, DateTime? startDate = null, 
                         DateTime? endDate = null)
{
    return new
    {
        param1 = param1,
        param2 = param2,
        startDate = startDate,
        endDate = endDate
    }.ToString();
}



config.Routes.MapHttpRoute(
    name: "Multiparam1",
    routeTemplate: "api/{controller}/{action}/{param1}/{startDate}/{endDate}",
    constraints: new
    {
        startDate = @"20\d\d-[0-1]?\d-[0-3]?\d",
        endDate = @"20\d\d-[0-1]?\d-[0-3]?\d"
    },
    defaults: new
    {
        param2 = RouteParameter.Optional,
        startDate = RouteParameter.Optional,
        endDate = RouteParameter.Optional
    }
);

config.Routes.MapHttpRoute(
    name: "Multiparam2",
    routeTemplate: "api/{controller}/{action}/{param1}/{param2}/{startDate}/{endDate}",
    constraints: new
    {
        startDate = @"(20\d\d-[0-1]?\d-[0-3]?\d)?",
        endDate = @"(20\d\d-[0-1]?\d-[0-3]?\d)?"
    },
    defaults: new
    {
        startDate = RouteParameter.Optional,
        endDate = RouteParameter.Optional
    }
);

この場合、次のことに注意してください。

  1. ルートが一致しない可能性があるため、図に示すように、正しい順序で登録する必要があります。最初にMultiparam2ルートを登録した場合次のようなURLを誤って処理します:http://localhost:1179/api/test/testaction/1/2014-12-12/2015-1-1、with param1=1; param2="2014-12-12"; startDate="2015-1-1"(のように、数値のみを受け入れるparam2に追加の制約を設定することで、これを回避できますparam2=@"\d+"
  2. アクションは、デフォルト値を持っている必要がありますstartDateendDate

結論

慎重に、さまざまな位置でデフォルトパラメータを処理できます。

  • 正しい順序でルートを登録する
  • ルートのデフォルトパラメータを定義し、コントローラのアクションのデフォルト値も定義します
  • 制約を使用する

ルートがどのように見えるかを慎重に計画すると、いくつかのルートとオプションのパラメーターを使用して必要なものを取得できます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

複数のオプションパラメータを持つ関数へのWebAPIルーティング

分類Dev

Flask - 複数のオプション パラメーターを使用したルーティング

分類Dev

複数のオプションパラメータWebAPI属性ルーティング

分類Dev

Laravelのオプションのルーティングパラメーター

分類Dev

複数のオプションパラメータでAPIをフィルタリングする

分類Dev

Angular2 +ルーティング-オプションのルートパラメータ

分類Dev

Angular-複数のオプションのルートパラメータ

分類Dev

ASP.NET MVC5でのオプションパラメーターのルーティング

分類Dev

Http.RouteAttributeを使用したオプションのパラメーターのルーティング

分類Dev

オプションの最初のパラメーターを使用したMVCルーティング

分類Dev

MVCルーティングのオプションの文字列パラメーターと醜いURL

分類Dev

TypeScriptの複数のオプションパラメータ

分類Dev

Rails3ルートと複数のオプションパラメータ

分類Dev

複数のパラメーターMVCルーティング

分類Dev

Web API属性ルーティングのオプションパラメーター

分類Dev

MVC代替ルーティングがオプションのパラメーターで失敗する

分類Dev

MVC5ルーティングとオプションのパラメーター

分類Dev

AngularJS:オプションのパラメーターを持つURLを使用したルーティング

分類Dev

Laravelルーティングでオプションのパラメーターを省略できますか?

分類Dev

オプションのtoおよびfromパラメーターを使用して行内の複数の日付をフィルタリングする

分類Dev

オプションのパラメータを使用したRails4ルーティング?

分類Dev

MVC5属性ルーティングのオプションパラメータ「名前」とは

分類Dev

ルーティング中のオプションパラメータangular2

分類Dev

ルーティングのLaravel5.5オプションパラメータが機能しない

分類Dev

CSS、アニメーションの複数のクラスタグプロパティを定義

分類Dev

symfony 4ルーティング:複数のスラッシュを持つ複数のパラメーター?

分類Dev

オプションのパラメーターとクエリパラメーターを使用したWebApi属性ルーティング

分類Dev

ActionResult必須パラメーターでオプションのMVCルーティングパラメーター

分類Dev

Aspectjオプションのパラメーターバインディング

Related 関連記事

  1. 1

    複数のオプションパラメータを持つ関数へのWebAPIルーティング

  2. 2

    Flask - 複数のオプション パラメーターを使用したルーティング

  3. 3

    複数のオプションパラメータWebAPI属性ルーティング

  4. 4

    Laravelのオプションのルーティングパラメーター

  5. 5

    複数のオプションパラメータでAPIをフィルタリングする

  6. 6

    Angular2 +ルーティング-オプションのルートパラメータ

  7. 7

    Angular-複数のオプションのルートパラメータ

  8. 8

    ASP.NET MVC5でのオプションパラメーターのルーティング

  9. 9

    Http.RouteAttributeを使用したオプションのパラメーターのルーティング

  10. 10

    オプションの最初のパラメーターを使用したMVCルーティング

  11. 11

    MVCルーティングのオプションの文字列パラメーターと醜いURL

  12. 12

    TypeScriptの複数のオプションパラメータ

  13. 13

    Rails3ルートと複数のオプションパラメータ

  14. 14

    複数のパラメーターMVCルーティング

  15. 15

    Web API属性ルーティングのオプションパラメーター

  16. 16

    MVC代替ルーティングがオプションのパラメーターで失敗する

  17. 17

    MVC5ルーティングとオプションのパラメーター

  18. 18

    AngularJS:オプションのパラメーターを持つURLを使用したルーティング

  19. 19

    Laravelルーティングでオプションのパラメーターを省略できますか?

  20. 20

    オプションのtoおよびfromパラメーターを使用して行内の複数の日付をフィルタリングする

  21. 21

    オプションのパラメータを使用したRails4ルーティング?

  22. 22

    MVC5属性ルーティングのオプションパラメータ「名前」とは

  23. 23

    ルーティング中のオプションパラメータangular2

  24. 24

    ルーティングのLaravel5.5オプションパラメータが機能しない

  25. 25

    CSS、アニメーションの複数のクラスタグプロパティを定義

  26. 26

    symfony 4ルーティング:複数のスラッシュを持つ複数のパラメーター?

  27. 27

    オプションのパラメーターとクエリパラメーターを使用したWebApi属性ルーティング

  28. 28

    ActionResult必須パラメーターでオプションのMVCルーティングパラメーター

  29. 29

    Aspectjオプションのパラメーターバインディング

ホットタグ

アーカイブ