web-dev-qa-db-ja.com

オプションパラメータを使用したMVCアクション-どちらが良いですか?

アクションシグネチャで次の2つの選択肢を使用する長所/短所はありますか?

public ActionResult Action(int? x) // get MVC to bind null when no parameter is provided
{
    if(x.HasValue)
    {
        // do something
    }
}

OR

public ActionResult Action(int? x = null) // C# optional parameter (virtual overload)
{
    if(x.HasValue)
    {
        // do something
    }
}
25
Zaid Masud

私は実際に2番目のアクションシグネチャを見たことがなく、その有用性を確認できません。

通常、最初のものはすべてのシナリオをカバーします。

  • パラメータが送信されない場合(GET /somecontroller/action)、アクション内でx引数の値はnullになります
  • Xパラメーターが送信されたが、有効な整数(GET /somecontroller/action?x=abc)、アクション内でx引数の値はnullになり、モデル状態は無効になります
  • Xパラメータが送信され、値が有効な整数(GET /somecontroller/action?x=123)、xが割り当てられます。

私の例では、クエリ文字列パラメーターでGETリクエストを使用しましたが、明らかに同じことが他のHTTP動詞にも適用され、xがルートパラメーターであった場合。

29
Darin Dimitrov

オプションのパラメーター値を指定する必要があるのは、null以外の値になる場合のみです。

MVC3は、オーバーロードまたはアクションの呼び出しで何も指定されていない場合、nullをパラメーターの値として自動的に設定します。

ただし、署名のこのパラメーターの後にオプションでないパラメーターがある場合、nullを呼び出しで指定する必要があることに注意してください。

したがって、署名の最後にすべてのオプションのパラメーターを配置するのが最善です。

7
Curt

最高のAsp.net MVCソリューション-アクションメソッドセレクターの使用

不要なコードブランチを削除してコントローラーアクションメソッドを簡素化し、次のようなコードを用意してください。

public ActionResult Index()
{
    // do something when there's no id
}

[RequiresRouteValues("id")]
public ActionResult Index(int id)
{
    // do something when id is present
}

RequiresRouteValuesAttributeアクションメソッドセレクターの非常に単純なコードを提供する限り、これはもちろん可能です。 このブログ投稿 でコードを見つけることができます。

私の意見では、これはこの問題の可能な限り最良の解決策です。

  1. 不要なブランチを削除してコードを簡素化します
  2. コードの保守が容易になります(複雑さが軽減されるため)
  3. Asp.net MVCフレームワークを可能な限り拡張します。
  4. パラメータタイプをそのままにする必要があります。パラメータタイプをnullに設定する必要はありません。
  5. 等.

とにかく。この手法に関するすべての詳細は、リンクされた投稿で詳細に説明されています。

6
Robert Koritnik