必须ASP.NET MVC控制器方法返回ActionResult?

作为ASP.NET MVC的新手,我一直想知道Controller方法的签名。 在我见过的所有例子中,他们似乎总是返回ActionResult,即使他们实际返回一个ViewResult实例或类似的东西。

这是一个常见的例子:

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

在这种情况下,将方法声明为public ViewResult Index()并获得更强的types支持是否更有意义?

实验表明,这是有效的,所以它似乎是可能的。

我意识到可能会出现多态性需要的情况(例如,如果只想在某些情况下redirect,但在其他情况下显示视图),但是如果方法总是返回一个视图,我会发现ViewResult更多可取的。

在未来的兼容性方面,ActionResult显然提供了一个更强大的签名,但是如果一个人控制整个代码库,那么总是可以将方法的签名更改为更一般的返回types(如果将来有必要的话)。

是我还没有意识到的任何其他考虑,或者我应该继续前进,并与特定的返回types声明我的控制器方法?

你绝对可以使用特定的返回types,尽pipe网上的大多数例子似乎都返回ActionResult 。 唯一的时候我会返回ActionResult类是不同的path的行动方法返回不同的子types。

Steven Sanderson也build议在他的书Pro ASP.NET MVC框架中返回特定的types。 看看下面的报价:

“这个动作方法明确地声明它返回一个ViewResult的实例,如果方法的返回types是ActionResult(所有操作结果的基类),那么它的工作原理是一样的,事实上,一些ASP.NET MVC程序员声明了所有的action方法返回一个非特定的ActionResult,即使他们知道它会一直返回一个特定的子类。但是,在面向对象编程中,方法应该返回最具体的types(以及接受他们可以使用的最常用的参数types)遵循这个原则最大限度地提高了调用你的方法的代码的便利性和灵活性,比如你的unit testing。

始终返回您可以返回的最准确的types。 所以当动作总是显示一个视图时,你应该返回一个ViewResult。 在某些情况下(无效发布数据)返回ViewResult时,我只会使用ActionResult,或者在其他情况下使用RedirectToRouteResult。

通过一些高级ActionFilter /执行场景,你甚至可以返回与ActionResult无关的完全不同的东西。

[部分回答]:你不总是返回ActionResult,不。 以下是您可以返回的其他一些结果的快速视图: http : //msdn.microsoft.com/en-us/library/dd410269%28v=vs.98%29.aspx

也许这会有所帮助。 祝你好运!

是的,你可以定义你的行为,如: public ViewResult Index() 。 但是有时候你的动作可能会返回不同的结果(如果没有以ActionResult类为基础声明结果是不可能的)。 例如:

 public ActionResult Show() { ... if(Request.IsAjaxRequest()) { return PartialView(...); } return View(...); } 

要么:

 public ActionResult Show() { ... try { ... } catch(Exception) { return RedirectToAction(...); } return View(...); } 

ActionResult是各种返回types的基类。 所以你的行为必须返回一个ActionResult 或从它派生的类才能工作。 常见的有ViewResultJsonResult

是的,我有桑德森的书,我喜欢这个部分是关于具体的,因为当我看着其他控制器动作的例子时,这让我很兴奋。 我的哲学,甚至b4学习MVC是因为函数(返回值的方法)应该被视为如果你声明一个variables/在上下文中可replace的variables/同一types的ref,具体的types,为你如果声明一个var(认为它想要避免在应用程序中定义所有的variables作为types“Object” – 更健壮,但是你失去了一些devise时检查和types安全性)。 便于控制器unit testing正确的返回types。

有关相关的参考资料,请查看Listkov的替代原则(“SOLID”中的“L”)。

Interesting Posts