アクションシグネチャで次の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
}
}
私は実際に2番目のアクションシグネチャを見たことがなく、その有用性を確認できません。
通常、最初のものはすべてのシナリオをカバーします。
GET /somecontroller/action
)、アクション内でx引数の値はnullになりますGET /somecontroller/action?x=abc
)、アクション内でx引数の値はnullになり、モデル状態は無効になりますGET /somecontroller/action?x=123
)、xが割り当てられます。私の例では、クエリ文字列パラメーターでGETリクエストを使用しましたが、明らかに同じことが他のHTTP動詞にも適用され、x
がルートパラメーターであった場合。
オプションのパラメーター値を指定する必要があるのは、null
以外の値になる場合のみです。
MVC3は、オーバーロードまたはアクションの呼び出しで何も指定されていない場合、null
をパラメーターの値として自動的に設定します。
ただし、署名のこのパラメーターの後にオプションでないパラメーターがある場合、null
を呼び出しで指定する必要があることに注意してください。
したがって、署名の最後にすべてのオプションのパラメーターを配置するのが最善です。
不要なコードブランチを削除してコントローラーアクションメソッドを簡素化し、次のようなコードを用意してください。
public ActionResult Index()
{
// do something when there's no id
}
[RequiresRouteValues("id")]
public ActionResult Index(int id)
{
// do something when id is present
}
RequiresRouteValuesAttribute
アクションメソッドセレクターの非常に単純なコードを提供する限り、これはもちろん可能です。 このブログ投稿 でコードを見つけることができます。
私の意見では、これはこの問題の可能な限り最良の解決策です。
とにかく。この手法に関するすべての詳細は、リンクされた投稿で詳細に説明されています。