搜索

C#的ActionResult是什么?有哪些类型?

幻夢星雲
发布: 2025-09-04 08:52:02
原创
267人浏览过
ActionResult是ASP.NET Core中表示控制器执行结果的抽象基类,通过其派生类或IActionResult接口实现多样化HTTP响应,如视图渲染、JSON数据返回、文件下载等,框架负责将其转换为实际响应;优先推荐使用IActionResult作为返回类型以提升灵活性和可维护性,因其支持多态返回不同结果类型;常见内置类型包括ViewResult、JsonResult、ContentResult、FileResult、RedirectToActionResult及各类StatusCodeResult,覆盖MVC与Web API主要场景;当内置类型不足时,可通过实现IActionResult接口自定义结果类,如CsvResult,以封装特定格式响应逻辑,增强代码复用性与控制力。

c#的actionresult是什么?有哪些类型?

C#中的

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
是ASP.NET Core MVC和Web API中一个非常核心的概念,它本质上是一个抽象基类,用于表示控制器动作方法(Action Method)执行后返回的结果。简单来说,它定义了框架如何将你的业务逻辑输出成一个HTTP响应,比如渲染一个视图、返回JSON数据、执行重定向,或者直接返回一个文件。我觉得,理解
ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
及其家族成员,是深入掌握ASP.NET Core响应机制的关键。

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
在ASP.NET Core中扮演着至关重要的角色,它提供了一种标准化的方式来处理各种HTTP响应。当一个控制器方法返回一个
ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
类型的实例时,框架会负责解析这个结果对象,并将其转换为实际的HTTP响应发送给客户端。这包括设置HTTP状态码、响应头以及响应体。

在我看来,

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的强大之处在于它极大地提升了控制器方法的灵活性和可读性。你不需要在控制器中手动操作
HttpResponse
登录后复制
对象,而是通过返回不同的
ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
派生类,就能清晰地表达你想要的结果。比如,当你需要返回一个网页时,就返回
ViewResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
;当需要提供API数据时,就返回
JsonResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
。这种设计模式,使得控制器专注于业务逻辑,而将HTTP响应的细节交由框架处理,这无疑是提高开发效率和代码质量的妙招。

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
IActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
:我该如何选择?

这确实是很多初学者,甚至一些有经验的开发者都会纠结的问题。在我看来,理解

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
IActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
之间的区别,以及它们各自的适用场景,是写出更灵活、更可测试代码的关键。

IActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
是一个接口,而
ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
是一个抽象类,它实现了
IActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
接口。这意味着所有继承自
ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的具体结果类型(比如
ViewResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,
JsonResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
等)也都实现了
IActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

那么,什么时候用

IActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,什么时候用
ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
呢?

我个人倾向于在大多数情况下使用

IActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
作为控制器方法的返回类型。为什么呢?因为它提供了最大的灵活性和解耦。当你的方法返回
IActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
时,你可以在方法内部根据不同的业务逻辑,返回任何实现了
IActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
接口的具体类型。例如:

public IActionResult GetProduct(int id)
{
    var product = _productService.GetProductById(id);
    if (product == null)
    {
        return NotFound(); // 返回一个NotFoundResult,它实现了IActionResult
    }
    return Ok(product); // 返回一个OkObjectResult,它也实现了IActionResult
}
登录后复制

这里,

NotFound()
登录后复制
Ok()
登录后复制
都是Controller基类提供的辅助方法,它们返回的都是实现了
IActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的具体类型。如果我将方法签名改为
public NotFoundResult GetProduct(int id)
登录后复制
,那么我就无法在成功时返回
OkObjectResult
登录后复制
登录后复制
了。

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,由于它是一个抽象类,更多时候我们不会直接返回
new ActionResult()
登录后复制
。我们通常会返回它的具体子类,比如
ViewResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
JsonResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
。但即使在这种情况下,如果方法签名写成
public ViewResult Index()
登录后复制
,也意味着你只能返回
ViewResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,失去了根据条件返回其他类型(比如重定向到登录页)的灵活性。

所以,我的建议是:

  • 优先使用
    IActionResult
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    :当你希望你的控制器方法能够根据不同的情况返回多种不同类型的响应时,
    IActionResult
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    是最佳选择。它提供了强大的多态性,使得代码更易于维护和扩展。
  • 在特定情况下使用具体的
    ActionResult
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    子类
    :如果你非常确定某个方法总是会返回同一种结果,并且你希望通过类型系统来强制这种约束(例如,一个API端点总是返回JSON),那么使用具体的
    JsonResult
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    或者
    OkObjectResult
    登录后复制
    登录后复制
    作为返回类型也是可以的。但这通常会降低一些灵活性。

总之,

IActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
代表了“我将返回一个动作结果”,而具体的
ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
子类则代表了“我将返回一个特定类型的动作结果”。在现代ASP.NET Core开发中,接口优先的设计理念通常会带来更好的可测试性和可维护性。

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的常见内置类型有哪些?它们分别用在什么场景?

ASP.NET Core为我们内置了非常丰富的

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
派生类,它们覆盖了Web应用和API开发中绝大多数的响应需求。理解这些类型及其用途,能让你更高效地构建应用。

以下是一些我经常使用的常见类型及其典型应用场景:

  • ViewResult
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    • 用途:用于渲染一个HTML视图,通常在传统的MVC应用中,控制器处理完请求后,将数据模型传递给视图进行展示。
    • 场景:显示用户界面,如用户注册页、商品详情页、博客文章列表等。
    • 示例
      return View(model);
      登录后复制
  • JsonResult
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    Supercreator
    Supercreator

    AI视频创作编辑器,几分钟内从构思到创作。

    Supercreator59
    查看详情 Supercreator
    • 用途:将C#对象序列化为JSON格式的字符串,并作为HTTP响应体返回。
    • 场景:构建RESTful API,为前端应用(如React, Angular, Vue)提供数据,或者在AJAX请求中返回数据。
    • 示例
      return Json(new { id = 1, name = "ProductA" });
      登录后复制
  • ContentResult
    登录后复制

    • 用途:返回一个纯文本字符串作为HTTP响应体,可以指定内容类型(Content-Type)。
    • 场景:返回简单的文本信息、XML字符串、或者其他自定义的纯文本内容,不涉及复杂的视图渲染或JSON序列化。
    • 示例
      return Content("Hello, World!", "text/plain");
      登录后复制
  • FileResult
    登录后复制
    (及其派生类如
    FileContentResult
    登录后复制
    登录后复制
    ,
    FilePathResult
    登录后复制
    ,
    FileStreamResult
    登录后复制
    ):

    • 用途:用于将文件作为HTTP响应返回,供客户端下载。
    • 场景:提供文件下载功能,如下载PDF报告、图片、压缩包等。
    • 示例
      return File(bytes, "application/pdf", "report.pdf");
      登录后复制
      FileContentResult
      登录后复制
      登录后复制
  • RedirectResult
    登录后复制
    登录后复制
    /
    RedirectToActionResult
    登录后复制
    登录后复制
    /
    RedirectToRouteResult
    登录后复制
    登录后复制

    • 用途:执行HTTP重定向,将客户端浏览器引导到另一个URL。
      • RedirectResult
        登录后复制
        登录后复制
        :重定向到指定的URL。
      • RedirectToActionResult
        登录后复制
        登录后复制
        :重定向到另一个控制器动作方法。
      • RedirectToRouteResult
        登录后复制
        登录后复制
        :重定向到由路由名称定义的URL。
    • 场景:用户成功提交表单后跳转到结果页,未登录用户访问受保护资源时跳转到登录页,或者将旧URL重定向到新URL。
    • 示例
      • return Redirect("https://example.com/new-page");
        登录后复制
      • return RedirectToAction("Details", "Product", new { id = 1 });
        登录后复制
  • StatusCodeResult
    登录后复制
    (及其派生类如
    OkResult
    登录后复制
    ,
    NotFoundResult
    登录后复制
    ,
    BadRequestResult
    登录后复制
    ,
    UnauthorizedResult
    登录后复制
    ,
    NoContentResult
    登录后复制
    等):

    • 用途:返回一个特定的HTTP状态码,通常不带响应体或带一个简单的响应体。
    • 场景:构建API时,明确表示请求的处理结果,如成功(200 OK)、资源未找到(404 Not Found)、请求无效(400 Bad Request)、未授权(401 Unauthorized)、无内容(204 No Content)等。
    • 示例
      • return Ok();
        登录后复制
        // 200 OK
      • return NotFound();
        登录后复制
        // 404 Not Found
      • return BadRequest("Invalid input.");
        登录后复制
        // 400 Bad Request,并带消息

这些只是最常用的一部分,ASP.NET Core还提供了像

PartialViewResult
登录后复制
(用于渲染局部视图)、
EmptyResult
登录后复制
(返回一个空的HTTP 200响应)、
PhysicalFileResult
登录后复制
(直接返回物理文件)等等。掌握它们,可以让你在不同场景下选择最合适的响应方式,写出更规范、更健壮的代码。

如何自定义
ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
以满足特殊需求?

有时候,内置的

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
类型并不能完全满足我们独特的需求。比如,你可能需要返回一个特定格式的数据(如CSV、自定义二进制协议),或者需要执行一些在框架默认处理之外的复杂响应逻辑。在这种情况下,自定义
ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
就显得尤为重要了。在我看来,这是ASP.NET Core扩展性的一种体现,让你能够深度定制框架行为。

自定义

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
其实并不复杂,主要有两种方式:

  1. 实现
    IActionResult
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    接口
    :这是最灵活的方式,你可以从头开始构建你的结果类型。
  2. 继承
    ActionResult
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    抽象类
    :如果你想复用
    ActionResult
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    提供的一些基础结构,可以继承它。但由于
    ActionResult
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    本身是抽象的,通常我们还是直接实现
    IActionResult
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    更常见。

核心在于实现

ExecuteResultAsync(ActionContext context)
登录后复制
方法。这个方法是框架调用来实际生成HTTP响应的地方。你可以在这个方法中直接操作
context.HttpContext.Response
登录后复制
对象,设置状态码、添加响应头、写入响应体等。

让我们以一个返回CSV数据的自定义

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
为例:

假设我们有一个

Product
登录后复制
列表,我们希望直接从API返回CSV格式的数据。

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;

// 假设Product模型
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public class CsvResult<T> : IActionResult
{
    private readonly IEnumerable<T> _data;
    private readonly string _fileName;

    public CsvResult(IEnumerable<T> data, string fileName = "data.csv")
    {
        _data = data;
        _fileName = fileName;
    }

    public async Task ExecuteResultAsync(ActionContext context)
    {
        var response = context.HttpContext.Response;
        response.ContentType = "text/csv";
        response.Headers.Add("Content-Disposition", $"attachment; filename=\"{_fileName}\"");

        using (var writer = new StreamWriter(response.Body, Encoding.UTF8))
        {
            // 写入CSV头部
            var properties = typeof(T).GetProperties();
            await writer.WriteLineAsync(string.Join(",", properties.Select(p => p.Name)));

            // 写入数据行
            foreach (var item in _data)
            {
                var values = properties.Select(p => p.GetValue(item)?.ToString() ?? "");
                await writer.WriteLineAsync(string.Join(",", values));
            }
            await writer.FlushAsync();
        }
    }
}
登录后复制

然后在你的控制器中,你可以这样使用它:

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;

[ApiController]
[Route("[controller]")]
public class ProductsController : ControllerBase
{
    private readonly List<Product> _products = new List<Product>
    {
        new Product { Id = 1, Name = "Laptop", Price = 1200.50m },
        new Product { Id = 2, Name = "Mouse", Price = 25.99m },
        new Product { Id = 3, Name = "Keyboard", Price = 75.00m }
    };

    [HttpGet("csv")]
    public IActionResult GetProductsAsCsv()
    {
        return new CsvResult<Product>(_products, "products.csv");
    }
}
登录后复制

通过这个例子,我们可以看到自定义

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的强大之处:

  • 封装性:将生成CSV的逻辑封装在一个独立的类中,提高了代码的复用性。
  • 灵活性:你可以完全控制HTTP响应的各个方面,从内容类型到响应头,再到响应体的内容。
  • 可测试性:由于它是一个独立的类,你可以更容易地对其进行单元测试。

自定义

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
通常在以下场景中非常有用:

  • 特定文件格式导出:除了CSV,还可以是Excel、自定义XML格式等。
  • 复杂二进制数据传输:例如,返回一个图像流,但需要进行特定的处理或添加自定义元数据。
  • 集成第三方渲染引擎:如果你需要使用一个非ASP.NET Core内置的模板引擎来渲染内容。
  • 特殊认证或授权响应:虽然框架内置了,但有时你可能需要非常定制化的错误响应。

掌握自定义

ActionResult
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的能力,意味着你对ASP.NET Core的响应机制有了更深层次的理解和控制力,能够解决那些“开箱即用”功能无法覆盖的边缘需求。

以上就是C#的ActionResult是什么?有哪些类型?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号