2009-08-20 18 views
0

私はすべてのコントローラアクションメソッドが適切なカスタム属性でマークされていることを主張するためにいくつかのユニットテストを書いていますが、パブリックメソッドがMVCアクションとして機能するかどうかを判断する基準は本当にわかりません。ASP.NET MVC:アクションのコントローラのメソッドの基準?

基準は戻り値の型(ActionResultまたは派生語である必要があります)である可能性があります。これは本当ですか?静的メソッドはどうですか?

答えて

5

が、それは次の基準を満たしている必要があります:

  • それはpublicなくstatic
  • でなければなりませんそれは排除するために「特別な」名前を持っていなければなりませんコンストラクタ、イベントなど
  • .ToString()およびファミリを除外するために、System.Web.Mvc.Controllerまたは他の基本クラスで定義してはいけません。

一般的なメソッドは例外をスローしますが、なんらかの理由でそれらはareアクションとみなされます。返品タイプについては、必ず返品することができるので、必ずActionResultである必要はありません。テキストデータの場合はです。

+0

三点目は、私が探していたものです:私はしませんでしたDispose()などのメソッドで何をすべきかを知っている。ありがとう –

+0

アクションメソッドに[NonAction]属性が適用されていると非常に扱いにくいことに注意してください。アクションメソッドであると思われるパブリックメソッドは、デフォルトの動作をオーバーライドする属性を持つことができます。 – Eilon

1

私はコントローラー内のすべてのパブリックメソッドをアクションとして扱います。たとえそれが文字列を返したとしてもです。アクション考慮すべき方法については

+0

アパートsauliusで述べたものから試していません。) – UpTheCreek

1

コントローラー上のアクションの真のリストを決定するのは難しい問題です。唯一正しい答えは、それが「依存する」ことです!サウリウスが与えたリストは、あなたがデフォルトのControllerActionInvokerを使っているならば、かなり正しいです。もちろん、ほとんどの人が使っています。

ロジックの重複を避けたい場合は、ControllerActionInvoker自体を使用してアクションのリストを取得し、それが返すリストの内容を確認することをお勧めします。

GetControllerDescriptor()メソッドを呼び出せるように、ControllerActionInvokerから派生したクラスを作成する必要があります。そのメソッドの戻り値はControllerDescriptorであり、これはコントローラーの抽象記述子です。 GetCanonicalActions()を呼び出すと、ActionDescriptorsのリストを返します。それらの項目のそれぞれは、典型的なものと動作方法を表しています。そのコントローラーを持っているControllerContextインスタンスを作成します

  • 、カスタム呼び出し
  • のインスタンスであるために、そのActionInvokerプロパティを設定して、コントローラをインスタンス化し

    1. :あなたがする必要がありますそれをすべてをフックする

      あなたのコントローラに設定されたインスタンス

    2. 呼び出し元の新しいパブリックメソッドを呼び出すと、GetControllerDescriptor()が呼び出されます。

    結果を確認したら、完了です!

    もちろん

    、私はこれのいずれかが、理論的には、それすべての作品:)

  • 関連する問題