当需要在模型绑定时处理一些复杂的逻辑的时候,需要自定义模型绑定。
语法
示例
新建文件夹CustomModelBinders,在此文件夹下新建类PersonModelBinder.cs,继承自接口IModelBinder,实现其方法public Task BindModelAsync(ModelBindingContext bindingContext)
public class PersonModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
Person person = new Person();
if (bindingContext.ValueProvider.GetValue("FirstName").Count() > 0
&& bindingContext.ValueProvider.GetValue("LastName").Length > 0
&& bindingContext.ValueProvider.GetValue("Email").Length > 0)
{
person.PersonName = string.Concat(bindingContext.ValueProvider.GetValue("FirstName").FirstValue,
" ", bindingContext.ValueProvider.GetValue("LastName").FirstValue);
person.Email = bindingContext.ValueProvider.GetValue("Email").FirstValue;
}
bindingContext.Result = ModelBindingResult.Success(person);
return Task.CompletedTask;
}
}
Controller中代码如下,类名前面添加[ModelBinder(BinderType = typeof(PersonModelBinder))]
public class HomeController : Controller
{
[Route("register")]
public IActionResult Index([FromBody]
[ModelBinder(BinderType = typeof(PersonModelBinder))]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中如下设置,经测试可以得到PersonName和Person类其它属性(只能得到这里自定义绑定的属性)