有人可以解释ASP.NET Core MVC中的操作筛选器和结果筛选器之间的区别吗?我真的没有阅读文档。我们在下面的图中(底部的灰色框)看到的结果执行到底是什么:
在文档中说
动作过滤器可以更改从动作返回的结果。
那么,如果它已经改变了结果,为什么我们需要一个结果过滤器?
答案 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();
}
}