C# 在ASP.NET Core中使用前缀绑定创建任意输入的字典
我们有一个服务,它是另一个platofrm的扩展。因为我们是平台的扩展,所以我们无法控制发送给我们的请求的形状 平台向我们的API发送一个请求,该请求包含一个C# 在ASP.NET Core中使用前缀绑定创建任意输入的字典,c#,asp.net-core,C#,Asp.net Core,我们有一个服务,它是另一个platofrm的扩展。因为我们是平台的扩展,所以我们无法控制发送给我们的请求的形状 平台向我们的API发送一个请求,该请求包含一个“Properties”对象属性。这个对象是参数的平面结构,我们可以定义这个平面结构 目前,我们的输入如下所示: { "Properties": { "fileLocation": { "value": "https://path.To.Storage/" }, "account": {
“Properties”
对象属性。这个对象是参数的平面结构,我们可以定义这个平面结构
目前,我们的输入如下所示:
{
"Properties": {
"fileLocation": {
"value": "https://path.To.Storage/"
},
"account": {
"value": "myAccountName"
},
"Metadata.ClientId": {
"value": "someGuid"
},
"Metadata.Name":{
"value": "custom name"
}
}
}
控制器方法的定义如下:
public IActionResult OnPost([FromBody]DeploymentInput input)
{
...
}
我们希望定义一个类似这样的模型,DeploymentInput
引用外部对象,即[FromBody]
输入,ValueString
表示存储在“value”
属性中的字符串:
public class DeploymentInput
{
public DeploymentProperties Properties { get; set; }
}
public class DeploymentProperties
{
[JsonRequired]
public ValueString Account { get; set; }
[JsonProperty("fileLocation", Required = Required.Always)]
public ValueString FileLocationUri { get; set; }
public IDictionary<string, ValueString> Metadata { get; set; }
}
公共类DeploymentInput
{
公共DeploymentProperties属性{get;set;}
}
公共类DeploymentProperties
{
[JsonRequired]
public ValueString帐户{get;set;}
[JsonProperty(“fileLocation”,Required=Required.Always)]
公共值字符串FileLocationUri{get;set;}
公共IDictionary元数据{get;set;}
}
在这里,以前缀“Metadata.”
传入的参数将被添加到元数据
字典中,键“ClientId”
和“Name”
以及值分别作为其对应的值字符串
我知道我们可以实现我们自己的模型绑定来实现这一点,但是可以使用任何内置框架来实现这个模型绑定吗?我发现使用prefix来指定键和值也可能有类似的情况,但是当从输入体尝试此操作时,我发现元数据字典为null
我们可以控制的是
“properties”
对象下的属性如何命名,以及其中有多少属性。我们可以控制的是“properties”对象下的属性如何命名,以及它们的数量。
您可以尝试在DeploymentProperties类中包括ClientId和Name属性,例如。这些值是动态的,取决于提出请求的客户。例如,客户1已将其帐户配置为跟踪“ClientId”和“Name”,但客户2可将其帐户配置为跟踪将发送给我们的完全不同的元数据,例如,仅跟踪“SubscriptionId”。可以传递的元数据属性没有绑定,因此希望对这些参数使用字典,但对服务强制发送的属性使用定义良好的参数。