C# 如何从BindingContext读取未命名对象
我需要实现自定义模型绑定,因此尝试为C# 如何从BindingContext读取未命名对象,c#,.net,json,asp.net-core,custom-model-binder,C#,.net,Json,Asp.net Core,Custom Model Binder,我需要实现自定义模型绑定,因此尝试为.netcore2.1api应用程序实现IModelBinder 型号等级- [ModelBinder(BinderType = typeof(PersonBinder))] public class Person { public name {get;set;} public address {get;set;} } API方法- [HttpPost] [Route("process")] public async
.netcore2.1api
应用程序实现IModelBinder
型号
等级-
[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
...
}
我用于测试的邮递员请求在正文中有JSON
对象,最简单的形式如下-
{
"name": "name1"
"address": "address1"
}
请注意,此请求来自我无法控制的现有遗留客户端,并且JSON
对象(将作为POST
中的主体)将没有名称
在VisualStudio
中的QuickWatch
中,我还看到bindingContext.ValueProvider.Count是1
和bindingContext.ModelMetadata
具有person
的参数和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;
}
公共任务BindModelAsync(ModelBindingContext bindingContext)
{
var request=bindingContext.HttpContext.request;
使用(var reader=newstreamreader(request.Body,Encoding.UTF8))
{
var bodyString=reader.ReadToEnd();
var person=bodyString.DeSerialize();//这是从JSON字符串反序列化到对象的自定义逻辑
//在这里编写您的模型绑定逻辑。。。
bindingContext.Result=ModelBindingResult.Success(个人);
}
返回Task.CompletedTask;
}