2011-01-06 6 views
5

サンプルMVCコードに表示されているほとんどすべてのコントローラメソッドが、コードが結果の1つのタイプのみを返すことができることが明らかであっても、なぜActionResultを返すのか不思議です。ロジックに応じてRedirectResultやViewResultを返すことがあるため、保証されている場合がありますが、これは私が見た方法のほとんどに当てはまりません。ほとんどのMVCサンプルコントローラコードがActionResultを返すのはなぜですか?

メソッドに「オブジェクト」の戻り値の型を持つことと同じではありませんか?戻り値の型としてJsonResult、FileResultまたはViewResultを指定するだけではどうですか?すべてのコントローラメソッドで、戻り値の型をActionResultに設定していないというメリットはありますか?

クラシック例:

public ViewResult Index() 
{ 
    return View(); 
} 

EDIT:

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

はなぜ、この代わりに、こののノルムであるように見えるんこれまでのところ、すべて1以外の応答のがあることを示しているのActionResultもっと一般的です。私はそれほど知っている。 :)コントローラメソッドではなぜこのような練習が受け入れられますか?通常のメソッドでできる最高のレベルベースのクラスを返すだけではなく、通常できる最も特殊な型を返そうとします。ブロガーと "サンプルコード作家"(はい、私はその言葉を作った)がコントローラのメソッドを非常に異なるものにするのは、単にActionResultを返すことだけでしょうか?

+0

[ASP.NET MVCコントローラメソッドを返す必要がありますActionResult?](http://stackoverflow.com/questions/1021568/must-asp-net-mvc-controller-methods-return-actionresult) – bzlm

答えて

6

ここで受け入れられている回答からの引用はここにあります。私には理にかなって:

Must ASP.NET MVC Controller Methods Return ActionResult?

あなたは絶対に ウェブ上のほとんどの例は のActionResultを返すように見えても、 種類の特定のリターンを使用することができます。私が唯一の時間を ActionResultクラスを返すのは、 アクションメソッドの異なるパス が異なるサブタイプを返すときです。

スティーブン・サンダソンは、 の書籍で特定のタイプを返すことをお勧めします。 Pro ASP.NET MVC Framework以下の引用を見 してください:

このアクションメソッドは、具体的 それはインスタンスするViewResultの を返すことを宣言しそれが同じだけ メソッドの戻り値の型 はのActionResult(基底クラスだった代わり場合を働くだろう。 のためのすべてのアクションの結果)。実際には、いくつかの ASP.NET MVCのプログラマは、彼らはそれが常に が復帰一つの特定のサブクラスをすることを確実に知る 場合でも、 非特異的なのActionResultを返すように、すべての そのアクションメソッドを宣言。 が、それはよく確立された0123だの原則では、オブジェクト指向の メソッドは、それらが可能な最も具体的なタイプの を返すようにプログラミングしています( として、最も一般的な のパラメータタイプを受け入れます)。 に従うと、この原則は、 の利便性とユニットテストなどの方法を と呼び出すコードに柔軟性を最大限に引き出します。

も参照してください。

http://www.bengtbe.com/blog/post/2009/07/01/Use-specific-return-types-in-your-ASPNET-MVC-action-methods.aspx

+0

私にも意味があり、これを答えとして受け入れますが、なぜ私はまだ興味がありますか?開発者がリターンタイプを可能な限り具体的に宣言するのに慣れている環境では、突然のMVCプログラマはすべて、ある特定のインスタンスでそのコンセプトを放棄したように見えます。全く意味がありません。 – Scott

+2

@Scott Schluer:コントローラアクションの実際の「消費コード」は、通常ブラウザまたはJavaScriptのいずれかであるため、タイプセーフの利点はこの特定のインスタンスではあまり顕著ではありません。 GWTのRPCフレームワークが設定されているように型保証言語でこのコードを使用することができれば、人々は特定の戻り値の型を設定することについてより慎重になると思います。 – StriplingWarrior

+2

私はActionResultを使用してそれらのすべてがかなり便利だとわかりました。この特定の状況では、減少したタイプの安全性の懸念がこれをもっとうまくいくと私は同意します。私はこれが主に利便性と可読性のために導き出された手法だと思います。私がActionReultを見るとき、私はこのメソッドの目的がすぐにわかる。そのアクションにリダイレクトする必要がある場合は、リターンタイプを変更する必要はありません。 – Derrick

0

戻り値の型がコントローラ内のロジックのb/cになるかどうかわからないときは、一般的な戻り値の型を使用する必要があります。それ以外の場合は - 具体的に使用してください(BETTERプログラミングとみなされます)。

人々はサンプルでのActionResultを使用する理由私は知らないが、私は、私は同意しない場合がありますサンプルで多くのことを見てきた - 何が良い取ると、そこに残りの部分を残して....

IMHO - あなたはこれが、あなたが使用する唯一の返されたオブジェクトであり、ActionResultsでないことがわかっているときは、ViewResultを使用する必要があります。

1

コードをより具体的にする必要がないため、より具体的な結果ではなくActionResultが返されると思います。

より一般的なタイプを使用すると、より柔軟になります。

戻り値の型を変更すると、Webアプリケーションプロジェクトで問題になることはありませんが、テストプロジェクト内のすべての単体テストも変更されることに注意してください。

+0

と思われるあなたが戻ってきたものを変更したら、とにかくその変更を反映するために単体テストを変更しなければならないと私には分かります。私はむしろ、コンパイラに「このユニットテストはこれ以上動作しません」と言うようにしたいと思います。多くの場合、返されたViewResultのModelが期待している値を持っているかどうかなどをテストするために、単体テストは実際の型に結果をキャストする必要があります。 – StriplingWarrior

+0

@ StriplingWarrior - 個人的には、自分のプロジェクトを構築して、ユニットテストのコードが壊れてプロジェクトのビルドを保留するのではなく、ユニットテストが失敗することがわかりました。 –

+0

私はそれが意見の問題だと思います。私は個人的にはコンパイル時に多くの問題をキャッチすることで時間を節約でき、タイプセーフなコンパイル言語を使用する最大の理由の1つです。 – StriplingWarrior

0

ActionResultがビューで処理できる最も高いオブジェクトである可能性があります。私にとって

ActionResult

ViewResult

System.Object 
    System.Web.Mvc.ActionResult 
    System.Web.Mvc.ViewResultBase 
     System.Web.Mvc.ViewResult 

、各XXXResultは、特定の用途に特化しています。 具体的に必要がない場合は...

0

私は本当の理由は、MVCテンプレートの自動生成コードがActionResultであなたを開始し、人々がパターンに従うことだと思います。多くの人はコントローラのアクションをユニットテストしないので、結果をタイプセーフな方法で消費しないので、これを苦労することになります。

+0

それは狂っているようです。 http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspxを参照してください。 Scott Guthrieもそうしています。私は彼が理解不足のために箱から出てくるものにちょうど従う開発者ではないと確信しています。 :)ただ、ビューを返すシンプルなコントローラメソッドですが、戻り値の型はActionResult ... – Scott

0

ScottGuが、それは同じ理由4をPROBなかった。それは例を表示するだけで簡単ですデモの対象は、多くの場合、あなたが見るODE品質が決まり、。それは単にexmaplesの場合、彼らは一般的にポイントを説明するためにgetherに何かを投げつけるでしょう(彼らは自分自身でb4の出版を終えてサンプルを書く/テストすることを容易にしました。これまで)ベストプラクティスとしては、HTMLやJS(本質的に)については「型を気にしない」ことについて、JavaScrip t(タイプの弱さのような)漏れ/感染するあなた自身の良いコーディングスタイル。可能であれば、特定のタイプを使用してください。さらに、JSのコードは、JSONの結果を期待していると思います(入力のベストプラクティスを使用してコード化されている場合)。また、コードもテストできることは間違いないので、試してみるとJSコードの手をそこに結びつけたくない可能な限りの型で正しいことをする。いくつかのケースでは、有害な影響が他のものよりも顕著である(実際にはより安全な言語に戻ってしまうなど)、それは一貫性を保つより良いプログラミング習慣です。一般的に、このようなことを行うことで、ある種の型キャスト/コフォールトがもたらされ、リターン時に使用するより具体的なオブジェクトの機能に戻ることができます(ベースオブジェクトでは利用できない可能性が高くなりますいつも、あなたのタイプはあまりにも特異的です/とにかくベースにすべきです)。キャスティングは本質的に醜い/悪いです。実行時に型を派生させると、いつも困ったことになります(何故、習慣が落胆しているのか/静的/強い型付け/安全性のベンが数十年にわたって賞賛されたのか)。あなたのコードの消費者/保守者がmetainfoを通して識別できるようにしてください(メソッドの上にカーソルを置くなど)。)関数が実際にやっている/戻っているもの。実際、単体テストの場合は、これがテストできる条件であるため(Steven Sandersonの本の抜粋から引用しているように)、単体テストの方が優れています。そして、弱く型付けされた理由としてビルドを保持したくない人を捕まえましたか?本当に?

関連する問題