步骤
1、Product.cs属性添加DataAnnotation
using System.ComponentModel.DataAnnotations;
namespace MinimalAPI.Models
{
public class Product
{
[Required(ErrorMessage = "Id can't be blank")]
[Range(1, int.MaxValue, ErrorMessage = "Id should be between 1 to maximum value of int")]
public int Id { get; set; }
[Required(ErrorMessage = "Product Name can't be blank")]
public string? ProductName { get; set; }
public override string ToString()
{
return $"Id: {Id}, ProductName: {ProductName}";
}
}
}
2、AddEndpointFilter
ProductsMapGroup.cs中更新POST方法
//POST /products
group.MapPost("/", async (HttpContext context, Product product) =>
{
products.Add(product);
await context.Response.WriteAsync("Product Added");
await context.Response.WriteAsync(JsonSerializer.Serialize(product));
}).AddEndpointFilter(async (EndpointFilterInvocationContext context, EndpointFilterDelegate next) =>
{
//Before logic
var product = context.Arguments.OfType<Product>().FirstOrDefault();
if (product == null)
{
return Results.BadRequest("Product details are not found in the request");
}
var validationContext = new ValidationContext(product);
List<ValidationResult> errors = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(product, validationContext, errors, true);
if (!isValid)
{
return Results.BadRequest(errors.FirstOrDefault()?.ErrorMessage);
}
//invokes the subsequent endpoint filter or endpoint's request delegate
var result = await next(context);
//After logic
return result;
});
结果
通过Postman测看到先执行了Before logic做了验证的工作,执行顺序同前面学到的ASP.NET Core Filters。
Gitee获取源码: