我需要实现自定义模型绑定,因此尝试为.Net Core 2.1 API
应用程序实现IModelBinder
。
Model
类 -
[ModelBinder(BinderType = typeof(PersonBinder))]
public class Person
{
public name {get;set;}
public address {get;set;}
}
API
方法 -
[HttpPost]
[Route("process")]
public async Task<ActionResult<int>> ProcessAsync([ModelBinder(typeof(PersonBinder))]Person person)
{
...
}
绑定模型方法 -
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var modelName = bindingContext.ModelName; //modelName is empty string
...
}
我用于测试的邮递员请求在body
中JSON
对象,最简单的形式如下所示 -
{
"name": "name1"
"address": "address1"
}
请注意,此请求来自我无法控制的现有旧客户端,并且POST
中将作为正文出现的JSON
对象将没有名称。
在VisualStudio
QuickWatch
中,我还看到bindingContext.ValueProvider.Count is 1
和bindingContext.ModelMetadata
Parameter
person
,Type
Person
和bindingContext.FieldName
person
。令人惊讶的是,bindingProvider.Result
Failed
bindingContext.ModelName
总是String.Empty
谁能帮我从BindingContext
那里得到ModelName
.如果在这种情况下无法获得ModelName
,那么我如何从BindingContext
读取Person
对象?
我已经找到了阅读已发布参数的最佳方法,由于我没有得到对此问题的任何答复,我将发布我是如何做到的,如果它对其他人有帮助的话
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var request = bindingContext.HttpContext.Request;
using (var reader = new StreamReader(request.Body, Encoding.UTF8))
{
var bodyString = reader.ReadToEnd();
var person = bodyString.DeSerialize<Person>(); //this is custom logic to de-serialize to object from JSON string
//write your model binding logic here...
bindingContext.Result = ModelBindingResult.Success(person);
}
return Task.CompletedTask;
}