C# 核心3.1-从正文绑定一些属性,从标题绑定另一些属性
我有以下型号:C# 核心3.1-从正文绑定一些属性,从标题绑定另一些属性,c#,.net,asp.net-core,.net-core,C#,.net,Asp.net Core,.net Core,我有以下型号: public class Network { public string Network { get; set; } public string Cidr { get; set; } public string TenantId { get; set; } } 以及以下端点: public async Task<ActionResult<Network>> PostNetwork(Network network) { ..
public class Network {
public string Network { get; set; }
public string Cidr { get; set; }
public string TenantId { get; set; }
}
以及以下端点:
public async Task<ActionResult<Network>> PostNetwork(Network network)
{
...
}
公共异步任务PostNetwork(网络)
{
...
}
并且想知道是否可以将网络
和Cidr
与我的帖子正文
中的值绑定,以及租户
与特定标题中的值绑定
我不想把entity.TenantId=HttpContext.Request.Headers[“TenantId”]代码>所有控制器端点,因为此模式对于多个实体/端点是必需的
我试图创建一个自定义的中间件来编辑我的身体内容,但是这些更改没有反映在我的控制器中。还尝试使用自定义DataBinder,但未成功。因此您需要创建自定义模型绑定器并向类添加属性
模型绑定器将继承自IModelBinder
,并假设您的数据是JSON
public class NetworkModelBinder : IModelBinder
{
public async Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
Network model;
string bodyAsText = await new StreamReader(bindingContext.HttpContext.Request.Body).ReadToEndAsync();
model = JsonConvert.DeserializeObject<Network>(bodyAsText);
model.TenantId = bindingContext.HttpContext.Request.Headers["TenantId"];
bindingContext.Result = ModelBindingResult.Success(model);
}
}
自定义数据绑定器出了什么问题,这应该是解决问题的方法。Eithy George,你有没有类似的例子?下面的文档对我来说不是很清楚应该如何实现它。当然,我会把它作为一个答案发布,它应该可以工作,但可能不是最好的做法,或者不是什么。我对类上的网络属性有一个问题,该属性说“成员名称不能与其封闭类型相同”,除此之外,它编译(对于core 2.1,但希望它在3.x中是相同的),请让我知道它是否对您有效。抱歉,这是我的错误,我在问题中更改了模型只是为了使其更简单,并且没有注意到名称冲突。是的,它有效,而且比我正在做的更干净,非常感谢。)只是做了一点修改,使其通用性和适应我的模型。谢谢
[ModelBinder(typeof(NetworkModelBinder))]
public class Network
{
public string Network { get; set; }
public string Cidr { get; set; }
public string TenantId { get; set; }
}