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

Mar*_*ann 57 polymorphism asp.net-mvc actionresult viewresult

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

这是一个常见的例子:

public ActionResult Index()
{
    return this.View();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

就未来的兼容性而言,ActionResult显然提供了更强大的签名,但如果有人控制整个代码库,则总是可以将方法的签名更改为更通用的返回类型(如果将来需要它).

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

Ben*_*tBe 58

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

Steven Sanderson还建议在他的书Pro ASP.NET MVC Framework中返回特定类型.看看下面的引用:

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

  • 在编写路由,过滤器或跨控制器操作执行逻辑的其他功能时,特定于控制器结果的优点在于,您可以轻松确定控制器操作是否返回JSON,视图等,而无需运行它. (2认同)

Pac*_*aco 13

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

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


Car*_*arl 8

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

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

  • 它们都来自ActionResult ......他在谈论方法的返回类型. (3认同)

eu-*_*-ne 7

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

public ActionResult Show()
{
    ...

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

    return View(...);
}
Run Code Online (Sandbox Code Playgroud)

要么:

public ActionResult Show()
{
    ...

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

    return View(...);
}
Run Code Online (Sandbox Code Playgroud)