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

时间:2009-06-20 13:01:43

标签: asp.net-mvc polymorphism actionresult viewresult

作为ASP.NET MVC的新手,我一直想知道Controller方法的签名。在我看到的所有示例中,它们似乎总是返回ActionResult,即使它们实际返回ViewResult实例或类似实例。

这是一个常见的例子:

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

在这种情况下,将方法声明为public ViewResult Index()并获得更强的类型支持会不会更有意义吗?

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

我确实意识到可能存在需要多态的情况(例如,如果您只想在某些情况下重定向,但在其他情况下显示视图),但是如果方法总是返回一个观点,我发现ViewResult更令人满意。

就未来兼容性而言,ActionResult显然提供了更强大的签名,但是如果一个人控制整个代码库,那么总是可以将方法的签名更改为更通用的返回类型,如果将来有必要的话。 / p>

是否有其他我不了解的注意事项,或者我应该继续并使用特定的返回类型声明我的控制器方法?

6 个答案:

答案 0 :(得分:57)

您绝对可以使用特定的返回类型,即使网络上的大多数示例似乎都返回 ActionResult 。我唯一一次返回 ActionResult 类是当action方法的不同路径返回不同的子类型时。

史蒂文桑德森还建议在他的书Pro ASP.NET MVC Framework中返回特定类型。看看下面的引用:

“这个动作方法明确地声明它返回一个ViewResult的实例。如果相反方法返回类型是ActionResult(所有动作结果的基类),它将工作相同。实际上,一些ASP。 NET MVC程序员声明他们所有的动作方法都返回一个非特定的ActionResult,即使他们确定它总会返回一个特定的子类。但是,在面向对象编程中,一个公认的原则是方法应该返回最具体的类型它们可以(以及接受最常用的参数类型)。遵循这一原则可以最大化调用方法的代码的便利性和灵活性,例如单元测试。“

答案 1 :(得分:13)

始终返回您可以返回的最准确类型。因此,当操作始终显示视图时,您应该返回ViewResult。在某些情况下(在无效的发布数据中)返回ViewResult或在其他情况下返回RedirectToRouteResult时,我只会使用ActionResult。

使用一些高级的actionfilter /执行方案,你甚至可以返回与ActionResult无关的完全不同的东西。

答案 2 :(得分:8)

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

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

答案 3 :(得分:7)

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

public ActionResult Show()
{
    ...

    if(Request.IsAjaxRequest())
    {
        return PartialView(...);
    }

    return View(...);
}

或:

public ActionResult Show()
{
    ...

    try
    {
        ...
    }
    catch(Exception)
    {
        return RedirectToAction(...);
    }

    return View(...);
}

答案 4 :(得分:3)

ActionResult是各种返回类型的基类。因此,您的操作必须返回ActionResult 或从其派生的类才能工作。常见的是ViewResultJsonResult等。

答案 5 :(得分:2)

是的,我有桑德森的书,我喜欢那部分是关于具体的,因为当我查看其他控制器动作示例时,这让我很烦恼。我的哲学甚至b4学习MVC是因为函数(返回值的方法)应当被视为在相同类型的变量/ ref的上下文中声明变量/可替换,具体关于类型,就像你一样如果声明一个var(想到它想要避免在应用程序中将所有变量定义为类型“对象” - 更强大,但是你会丢失一些设计时检查和类型安全性)。便于控制器单元测试正确的返回类型。

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