ASP.NET MVC:控制器方法成为行动的标准?

时间:2009-08-20 10:01:21

标签: asp.net-mvc

我正在编写一些单元测试来声明我们所有的控制器操作方法都标有适当的自定义属性,但我真的不知道用于确定公共方法是否可以充当MVC操作的标准。

我认为标准可以是返回值类型(它必须是ActionResult或衍生物)。这是真的?静态方法怎么样?

3 个答案:

答案 0 :(得分:5)

对于要被视为某个操作的方法,它必须符合以下条件:

  • 必须是public而不是static
  • 为了排除构造函数,事件等,它必须没有“特殊”名称。
  • 不得在System.Web.Mvc.Controller或任何其他基类定义,以排除.ToString()和家人。

通用方法会引发异常,但由于某种原因,它们are考虑了操作。至于返回类型,它不一定必须是ActionResult,因为您可以返回例如一个string用于文本数据。

答案 1 :(得分:1)

我相信控制器中的所有公共方法都被视为操作 - 即使是一个返回字符串。

答案 2 :(得分:1)

确定控制器上的真实操作列表是一个棘手的问题。唯一正确的答案是“依赖”! Saulius提供的列表非常正确 - 如果您使用默认的ControllerActionInvoker - 当然,大多数人都使用它。

如果你想避免重复逻辑,我建议使用ControllerActionInvoker本身获取操作列表,然后验证它返回的列表内容。

您必须编写一个派生自ControllerActionInvoker的类,以便您可以调用GetControllerDescriptor()方法。该方法的返回值是ControllerDescriptor,它是控制器具有的抽象描述符。然后,您可以调用GetCanonicalActions(),它返回一个ActionDescriptors列表。这些项目中的每一项都代表了典型的和行动方法。

要把它全部搞定,你需要:

  1. 实例化您的控制器
  2. 将其ActionInvoker属性设置为自定义调用程序的实例
  3. 创建一个将Controller实例设置为控制器的ControllerContext实例
  4. 在您的调用者上调用一个新的公共方法,然后调用GetControllerDescriptor()
  5. 然后验证结果,你就完成了!

    当然,我没有尝试过这一点,但从理论上讲,这一切都有效:)