结果过滤器如何在ASP.NET Core中工作?

时间:2020-11-07 02:11:51

标签: c# asp.net-core-mvc

有人可以解释ASP.NET Core MVC中的操作筛选器和结果筛选器之间的区别吗?我真的没有阅读文档。我们在下面的图中(底部的灰色框)看到的结果执行到底是什么:enter image description here

在文档中说

动作过滤器可以更改从动作返回的结果

那么,如果它已经改变了结果,为什么我们需要一个结果过滤器?

1 个答案:

答案 0 :(得分:1)

根据Microsoft文档:

动作过滤器:

  • 在调用操作方法之前和之后立即运行代码
  • 可以更改传递给操作的参数。
  • 可以更改操作返回的结果。
  • Razor页面中不支持。

但是,ResultFilter的执行力有所不同:

结果过滤器在执行操作结果之前和之后立即运行代码。 它们仅在action方法成功执行后运行。它们对于必须围绕视图或格式化程序执行的逻辑很有用。

请考虑为具有很多属性的User模型向客户端返回API响应。您可以像这样基于API模型合同简单地创建响应:

public class UserDetailFilter : ResultFilterAttribute
{
        public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
    {
        var result = context.Result as ObjectResult;
        if (result?.Value is UserResponse value)
            result.Value = new
            {
                Id = value.Id,
                Username = value.Username,
                Fullname = value.Fullname,
                Mobile = value.Mobile,
                Email = value.Email,
                UpdatedAt = value.UpdatedAt
            };
        await next();
    }
}