语法
示例
在CustomModelBinders文件夹下新建类PersonBinderProvider.cs
public class PersonBinderProvider : IModelBinderProvider
{
public IModelBinder? GetBinder(ModelBinderProviderContext context)
{
if (context.Metadata.ModelType == typeof(Person))
{
return new BinderTypeModelBinder(typeof(PersonBinderProvider));
}
return null;
}
}
Program.cs中添加options.ModelBinderProviders.Insert(0, new PersonBinderProvider());
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
options.ModelBinderProviders.Insert(0, new PersonBinderProvider());
});
builder.Services.AddControllers().AddXmlSerializerFormatters();
var app = builder.Build();
//app.MapGet("/", () => "Hello World!");
app.UseStaticFiles();
app.UseRouting();
app.MapControllers();
app.Run();
Controller中删除[ModelBinder(BinderType = typeof(PersonModelBinder))]
[Route("register")]
public IActionResult Index([FromBody] Person person) //添加[FromBody]后可以接收到数据
{
if (!ModelState.IsValid)
{
string errors = string.Join("\n",
ModelState.Values.SelectMany(value => value.Errors)
.Select(err => err.ErrorMessage));
return BadRequest(errors);
}
return Content($"{person}");
}
Postman如下设置,测试结果是Controller中方法参数中Person类前面不用修饰[ModelBinder(BinderType = typeof(PersonModelBinder))]即可完成自定义模型绑定,得到了自定义模型绑定的属性值,如果是多个方法中用到Person类作为参数,不需要多次添加[ModelBinder(BinderType = typeof(PersonModelBinder))]