代码之家  ›  专栏  ›  技术社区  ›  Mark Seemann

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

  •  56
  • Mark Seemann  · 技术社区  · 17 年前

    作为ASP.NET MVC的新手,我一直在想控制器方法的签名。在我看到的所有示例中,它们似乎总是返回actionResult,即使它们实际上返回了一个viewResult实例或类似实例。

    下面是一个常见的例子:

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

    在这种情况下,将方法声明为 public ViewResult Index() 得到更强大的类型支持?

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

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

    在将来的兼容性方面,actionResult显然提供了一个更健壮的签名,但是如果一个方法控制了整个代码基,那么如果将来需要的话,总是可以将方法的签名更改为更通用的返回类型。

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

    6 回复  |  直到 11 年前
        1
  •  57
  •   BengtBe    16 年前

    您完全可以使用特定的返回类型,即使Web上的大多数示例似乎都返回 行动结果 . 唯一一次我会返回 行动结果 类是当操作方法的不同路径返回不同的子类型时。

    StevenSanderson还建议在他的书中返回特定的类型 Pro ASP.NET MVC Framework . 请看下面的报价:

    “此操作方法专门声明它返回一个ViewResult实例。如果方法返回类型为ActionResult(所有操作结果的基类),那么它的工作原理将完全相同。事实上,一些ASP.NET MVC程序员声明他们的所有操作方法都返回一个非特定的actionResult,即使他们确信它总是返回一个特定的子类。然而,在面向对象编程中,方法应该返回它们可以返回的最具体的类型(以及接受它们可以接受的最一般的参数类型)是一个公认的原则。遵循这一原则,可以最大限度地提高调用方法(如单元测试)的代码的便利性和灵活性。”

        2
  •  13
  •   Xm7X    12 年前

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

    使用一些高级的actionfilter/执行场景,您甚至可以返回与actionresult无关的完全不同的内容。

        3
  •  8
  •   Holger Just    12 年前

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

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

        4
  •  7
  •   eu-ge-ne    17 年前

    是的,您可以定义您的操作,例如: public ViewResult Index() . 但有时你的行为会返回不同的结果(不把结果声明为基础是不可能的) ActionResult 班级)。例如:

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

    或:

    public ActionResult Show()
    {
        ...
    
        try
        {
            ...
        }
        catch(Exception)
        {
            return RedirectToAction(...);
        }
    
        return View(...);
    }
    
        5
  •  3
  •   GalacticCowboy    17 年前

    actionResult是各种返回类型的基类。所以您的操作必须返回actionResult 或从中派生的类 为了工作。常见的是 ViewResult , JsonResult 等。

        6
  •  2
  •   Galaxis    14 年前

    是的,我有桑德森的书,我喜欢具体的部分,因为当我在看其他的控制器操作示例时,这让我很恼火。我的哲学甚至是B4 Learning MVC都是这样的,因为函数(返回值的方法)应该被视为在上下文中声明同一类型的变量/引用的一个变量/可替换的,所以对于类型要特别,就像声明一个变量一样(把它看作是要避免将所有变量定义为“对象”类型一样“在应用程序中-更健壮,但会丢失一些设计时检查和类型安全性)。也便于控制器单元测试正确的返回类型。

    有关参考资料,请参阅listkov的替代原理(“solid”中的“l”)。