58

ASP.NET MVC は初めてなので、Controller メソッドのシグネチャについて疑問に思っていました。私が見たすべての例では、実際に ViewResult インスタンスなどを返す場合でも、常に ActionResult を返すように見えます。

一般的に見られる例を次に示します。

public ActionResult Index()
{
    return this.View();
}

そのような場合、メソッドを として宣言し、public ViewResult Index()より強力な型サポートを取得する方が理にかなっているのではないでしょうか?

実験により、これが機能することが示されているため、可能であると思われます。

ポリモーフィズムが必要な状況があることは承知していますが (たとえば、特定の状況でのみリダイレクトしたいが、他の状況でビューを表示したい場合)、メソッドが常にビューを返す場合は、ViewResult をもっと見つけます望ましい。

将来の互換性に関しては、ActionResult は明らかにより堅牢な署名を提供しますが、コード ベース全体を制御する場合は、将来必要になった場合にメソッドの署名をより一般的な戻り値の型に変更することが常に可能です。

私が認識していないその他の考慮事項はありますか、それとも先に進んで特定の戻り値の型でコントローラーメソッドを宣言する必要がありますか?

4

6 に答える 6

60

Web 上のほとんどの例はActionResultを返すように見えますが、特定の戻り値の型を絶対に使用できます。ActionResultクラスを返すのは、アクション メソッドのさまざまなパスがさまざまなサブタイプを返す場合だけです。

Steven Sanderson も、著書Pro ASP.NET MVC Frameworkで特定の型を返すことを推奨しています。以下の引用を見てください。

このアクション メソッドは、ViewResult のインスタンスを返すことを明示的に宣言します。メソッドの戻り値の型が ActionResult (すべてのアクション結果の基本クラス) の場合でも、同じように機能します。実際、一部の ASP.NET MVC プログラマーは、特定のサブクラスを常に返すことが確実にわかっている場合でも、すべてのアクション メソッドが非特定の ActionResult を返すと宣言しています。ただし、オブジェクト指向プログラミングでは、メソッドが可能な限り最も具体的な型を返す必要がある (および可能な限り一般的なパラメーター型を受け入れる必要がある) というのが確立された原則です。この原則に従うことで、単体テストなど、メソッドを呼び出すコードの利便性と柔軟性が最大化されます。

于 2009-06-20T13:33:59.313 に答える
13

返すことができる最も正確な型を常に返します。したがって、アクションが常にビューを表示する場合は、ViewResult を返す必要があります。場合によっては(無効な投稿データ)または RedirectToRouteResult で ViewResult に戻る場合にのみ ActionResult を使用します。

いくつかの高度な actionfilter/executing シナリオを使用すると、ActionResult とは関係のないまったく異なるものを返すことさえできます。

于 2009-06-20T13:18:21.733 に答える
8

[部分回答]: いつも ActionResult を返すとは限りません。返すことができるその他の結果のリストを次に示します。

  • 結果を表示
  • PartialViewResult
  • RedirectResult
  • RedirectToRouteResult
  • コンテンツ結果
  • JsonResult
  • JavaScript結果
  • ファイル結果
  • 空の結果

詳細については、ドキュメントを参照してください。

多分それは少し役立つでしょう。幸運を!

于 2009-06-20T13:13:06.580 に答える
7

はい、次のようにアクションを定義できますpublic ViewResult Index()ActionResultただし、アクションが異なる結果を返す場合があります (結果を基本クラスとして宣言しないと不可能です)。例えば:

public ActionResult Show()
{
    ...

    if(Request.IsAjaxRequest())
    {
        return PartialView(...);
    }

    return View(...);
}

また:

public ActionResult Show()
{
    ...

    try
    {
        ...
    }
    catch(Exception)
    {
        return RedirectToAction(...);
    }

    return View(...);
}
于 2009-06-20T13:40:42.327 に答える
3

ActionResult は、さまざまな戻り値の型の基本クラスです。したがって、アクションが機能するには、ActionResultまたはそれから派生したクラスを返す必要があります。一般的なものは、、ViewResultなどJsonResultです。

于 2009-06-20T14:12:45.650 に答える
2

ええ、私はサンダーソンの本を持っています。他のコントローラー アクションの例を見ているときに、それが私を悩ませていたので、具体的であることについてのその部分が好きでした。MVC を学習する私の哲学でさえ、関数 (値を返すメソッド) は、変数を宣言するかのように扱われるべきであり、同じ型の変数/ref のコンテキストで置換可能である必要があるため、型について具体的にする必要があるということでした。 var を宣言する場合 (アプリですべての変数を「オブジェクト」型として定義することを避けたいと考えてください。より堅牢ですが、設計時のチェックと型の安全性が失われます)。正しい戻り値の型についてもコントローラー単体テストを容易にします。

関連する参考資料として、Listkov's Substitution Principle (「SOLID」の「L」) も参照してください。

于 2012-03-14T21:18:51.997 に答える