在ASP.Net MVC中,如果我在控制器上有一个返回View的方法,那么该方法应该是ViewResult类型还是更一般的ActionResult?
答案 0 :(得分:4)
在ASP.NET论坛上提出了类似的问题:http://forums.asp.net/t/1423519.aspx
基本上,它归结为样式 - 在OOP中,您尝试返回您可以给出的最具体的类型。对于您拥有的每种方法,您都不会返回object
- 有时您会返回string
,有时会返回List
,有时会返回自定义类。
在论坛的回复中,有人引用了斯蒂芬·沃尔特的书:
注意这个动作方法 声明它返回一个实例 ViewResult。它只会起作用 相反,如果方法返回类型 是ActionResult(基类) 所有行动结果)。其实有些 ASP.NET MVC程序员声明了所有 他们的行动方法如返回 非特异性的ActionResult,即使他们 确切地知道它会永远 返回一个特定的子类。 然而,它是一个成熟的 面向对象的原则 编程方法应返回 最具体的类型(如 以及接受最一般的 他们可以参数类型)。以下 这个原则最大化了便利性 和调用代码的灵活性 你的方法,比如你的单元测试。
因此,首选使用更具体的ViewResult
,尤其是从单元测试的角度来看。
答案 1 :(得分:2)
当参数尽可能通用时,方法最有用(例如,IEnumerable<T>
而不是数组)并且其返回值尽可能具体(例如,IList<T>
代替IEnumerable
)。
但是,使用返回值,使用接口或抽象类型而不是具体类型(例如,IList<T>
而不是List<T>
)仍然更好,这将为您提供更改实现的灵活性或至少最小化与调用代码的耦合。
如果您没有预见到将结果更改为任何其他类型的ActionResult,则可以使其返回ViewResult。如果你没有预见到任何调用者特别利用了ViewResult,那么它可以作为ActionResult返回,但这两种方式都无关紧要。