AddControllers/AddMvc方法允许添加自定义ActionFilterAttribute进行过滤#
文档中这么定义Filter:
可以创建自定义筛选器,用于处理横切关注点。 横切关注点的示例包括错误处理、缓存、配置、授权和日志记录。 筛选器可以避免复制代码。 例如,错误处理异常筛选器可以合并错误处理。
通过不同的接口定义,筛选器同时支持同步和异步实现。
同步筛选器在其管道阶段之前和之后运行代码。 例如,OnActionExecuting 在调用操作方法之前调用。 OnActionExecuted 在操作方法返回之后调用。
添加自定义模型验证
自定义筛选器依赖注入方式#
public void ConfigureServices(IServiceCollection services)
{
// Add service filters.
services.AddScoped<AddHeaderResultServiceFilter>();
services.AddScoped<SampleActionFilterAttribute>();
services.AddControllersWithViews(options =>
{
options.Filters.Add(new AddHeaderAttribute("GlobalAddHeader",
"Result filter added to MvcOptions.Filters")); // An instance
options.Filters.Add(typeof(MySampleActionFilter)); // By type
options.Filters.Add(new SampleGlobalActionFilter()); // An instance
});
}
.net core 中 api 模型验证#
starp.cs
services.AddControllers(options =>
{
options.Filters.Add(new ModelActionFilter());
options.Filters.AddService<ExceptionFilter>();
options.MaxModelValidationErrors = 50;
options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor(
_ => "该字段不可为空。");
})
添加ModelActionFilter
public class ModelActionFilter : ActionFilterAttribute, IActionFilter
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
var errorResults = new List<ErrorResultDto>();
foreach (var item in context.ModelState)
{
var result = new ErrorResultDto
{
Field = item.Key,
Msg = "",
};
foreach (var error in item.Value.Errors)
{
if (!string.IsNullOrEmpty(result.Msg))
{
result.Msg += ‘|‘;
}
result.Msg += error.ErrorMessage;
}
errorResults.Add(result);
}
context.Result = new JsonResult(Result.FromCode(ResultCode.InvalidData, errorResults));
}
}
}
public class ErrorResultDto
{
/// <summary>
/// 参数领域
/// </summary>
public string Field { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public string Msg { get; set; }
}