ChatGPT解决这个技术问题 Extra ChatGPT

ViewResult() 和 ActionResult() 之间的区别

ASP.NET MVC 中的 ViewResult()ActionResult() 有什么区别?

public ViewResult Index()
{
    return View();
}

public ActionResult Index()
{
    return View();
}
好问题。我观看了一个视频并创建单元测试,讲师首先将他要测试的 Action 的返回类型从 ActionResult 更改为 ViewResult。没有解释......我就像“我们可以随机改变类型吗?没有解释”
可能这个文档很有帮助:) msdn.microsoft.com/en-us/library/…

S
SeanKilleen

ActionResult 是一个抽象类,可以有多个子类型。

ActionResult 子类型

ViewResult - 将指定的视图呈现给响应流

PartialViewResult - 将指定的部分视图呈现给响应流

EmptyResult - 返回一个空响应

RedirectResult - 执行到指定 URL 的 HTTP 重定向

RedirectToRouteResult - 根据给定的路由数据,对路由引擎确定的 URL 执行 HTTP 重定向

JsonResult - 将给定的 ViewData 对象序列化为 JSON 格式

JavaScriptResult - 返回一段可以在客户端执行的 JavaScript 代码

ContentResult - 将内容写入响应流而不需要视图

FileContentResult - 将文件返回给客户端

FileStreamResult - 将文件返回给客户端,由 Stream 提供

FilePathResult - 将文件返回给客户端

资源

动作方法的 ActionResult 和 ViewResult 有什么区别? [ASP.NET 论坛]


返回 ViewResult 优于 ActionResult 的优势是什么 - 它只是更具语义性并显示您的意图 - 但实际上通常没有区别?
R
RPM1984

ActionResult 是一个抽象类。

ViewResult 派生自 ActionResult。其他派生类包括 JsonResult 和 PartialViewResult。

您以这种方式声明它,以便您可以利用多态性并在同一方法中返回不同的类型。

例如:

public ActionResult Foo()
{
   if (someCondition)
     return View(); // returns ViewResult
   else
     return Json(); // returns JsonResult
}

这是否意味着我们应该始终返回 ActionResult 以便我们利用它。或者这有什么限制或副作用?
@Adarsh - C# 中的任何抽象类都一样。如果您想将实现封装在方法中或希望将来证明您的 API 可用于其他派生类型,请以这种方式声明。如果没有,请使用混凝土。我一般使用具体的(例如 ViewResult 或 JsonResult)
R
RickAndMSFT

出于同样的原因,您不会编写每个类的每个方法来返回“对象”。你应该尽可能具体。如果您打算编写单元测试,这尤其有价值。不再测试返回类型和/或转换结果。


根据我的经验,更简洁的代码和单元测试是使用 ViewResult 的好处。
R
Robert Levy

ViewResult 是 ActionResult 的子类。 View 方法返回一个 ViewResult。所以这两个代码片段确实做了完全相同的事情。唯一的区别是,对于 ActionResult 之一,您的控制器不承诺返回视图 - 您可以更改方法主体以有条件地返回 RedirectResult 或其他内容,而无需更改方法定义。


C
Community

虽然其他答案已经正确指出了差异,但请注意,如果您实际上只返回 ViewResult ,最好返回更具体的类型而不是基本 ActionResult 类型。此原则的一个明显例外是当您的方法返回派生自 ActionResult 的多种类型时。

有关此原则背后原因的完整讨论,请参阅此处的相关讨论:Must ASP.NET MVC Controller Methods Return ActionResult?


A
Andrew Stubbs

在 Controller 中,可以使用以下语法

public ViewResult EditEmployee() {
    return View();
}

public ActionResult EditEmployee() {
    return View();
}

在上面的例子中,只有返回类型不同。一个返回 ViewResult 而另一个返回 ActionResult

ActionResult 是一个抽象类。它可以接受:

ViewResult , PartialViewResult , EmptyResult , RedirectResult , RedirectToRouteResult , JsonResult , JavaScriptResult , ContentResult , FileContentResult , FileStreamResult , FilePathResult 等。

ViewResultActionResult 的子类。


我不确定这是否是您的意思,但以防万一我想澄清您不能同时使用这两种方法,因为它们的名称和(否)参数是相同的。仅通过更改结果类型来重载方法是不可能的。
在面试问题博客文章中添加了详细信息 topinterviewquestion.com/article/…
A
Abhishek Duppati

在控制器中,我使用 ActionResult 指定了以下代码,它是 MVC 中可以有 11 个子类型的基类,例如:ViewResult、PartialViewResult、EmptyResult、RedirectResult、RedirectToRouteResult、JsonResult、JavaScriptResult、ContentResult、FileContentResult、FileStreamResult、FilePathResult。

    public ActionResult Index()
                {
                    if (HttpContext.Session["LoggedInUser"] == null)
                    {
                        return RedirectToAction("Login", "Home");
                    }

                    else
                    {
                        return View(); // returns ViewResult
                    }

                }
//More Examples

    [HttpPost]
    public ActionResult Index(string Name)
    {
     ViewBag.Message = "Hello";
     return Redirect("Account/Login"); //returns RedirectResult
    }

    [HttpPost]
    public ActionResult Index(string Name)
    {
    return RedirectToRoute("RouteName"); // returns RedirectToRouteResult
    }

同样,我们可以使用 ActionResult() 返回所有这 11 个子类型,而无需显式指定每个子类型方法。如果您要返回不同类型的视图,ActionResult 是最好的选择。


w
wjxie

为了节省您的时间,这里是来自 https://forums.asp.net/t/1448398.aspx 上一个答案中的链接的答案

ActionResult 是一个抽象类,是 ViewResult 类的基类。

在 MVC 框架中,它使用 ActionResult 类来引用您的操作方法返回的对象。并在其上调用 ExecuteResult 方法。

而 ViewResult 是这个抽象类的一个实现。它将尝试通过给定的视图名称在一些预定义的路径(/views/controllername/、/views/shared/ 等)中查找视图页面(通常是 aspx 页面)。

让您的方法返回更具体的类通常是一个好习惯。因此,如果您确定您的操作方法将返回一些视图页面,您可以使用 ViewResult。但是,如果您的操作方法可能具有不同的行为,例如呈现视图或执行重定向。您可以使用更通用的基类 ActionResult 作为返回类型。