如何在.NET 6 Minimal API中实现类似ASP.NET Core 5的自定义ActionResult功能
方案确认
你查阅的资料是正确的,.NET 6 Minimal API 中自定义返回结果的标准实现方案就是实现IResult接口,它替代了 MVC 架构中ActionResult的角色,负责自定义 HTTP 响应的生成逻辑。
具体实现代码
和你之前的ErrorResult逻辑对齐的实现如下:
public class ErrorResult : IResult { private readonly IList<Error> _errors; // 可根据需求调整默认状态码,示例用400 BadRequest private readonly int _statusCode = StatusCodes.Status400BadRequest; public ErrorResult(IList<Error> errors, int? statusCode = null) { _errors = errors; if (statusCode.HasValue) { _statusCode = statusCode.Value; } } // IResult 接口唯一需要实现的方法,入参为当前请求的HttpContext public async Task ExecuteAsync(HttpContext httpContext) { // 这里替换为你原来的自定义响应生成逻辑即可 httpContext.Response.StatusCode = _statusCode; httpContext.Response.ContentType = "application/json; charset=utf-8"; // 示例:序列化错误列表写入响应体,也可以替换为你自己的序列化逻辑 await httpContext.Response.WriteAsJsonAsync(_errors); } }
使用方法
你可以直接在 Minimal API 的路由处理逻辑中返回该实例,和之前 MVC 控制器中的用法完全一致:
app.MapPost("/validate", (ValidateInput input) => { var errors = new List<Error>(); if(string.IsNullOrEmpty(input.Name)) { errors.Add(new Error("名称不能为空")); } if(errors.Any()) { return new ErrorResult(errors); } return Results.Ok(); });
可选优化
如果你想和 Minimal API 内置的Results.Ok()、Results.NotFound()等用法保持统一,可以新增静态工具类封装实例创建逻辑:
public static class CustomResults { public static IResult Error(IList<Error> errors, int? statusCode = null) { return new ErrorResult(errors, statusCode); } }
优化后调用更简洁:
return CustomResults.Error(errors);
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

