C# 在ASP.NET Core中使用前缀绑定创建任意输入的字典

C# 在ASP.NET Core中使用前缀绑定创建任意输入的字典,c#,asp.net-core,C#,Asp.net Core,我们有一个服务,它是另一个platofrm的扩展。因为我们是平台的扩展,所以我们无法控制发送给我们的请求的形状 平台向我们的API发送一个请求,该请求包含一个“Properties”对象属性。这个对象是参数的平面结构,我们可以定义这个平面结构 目前,我们的输入如下所示: { "Properties": { "fileLocation": { "value": "https://path.To.Storage/" }, "account": {

我们有一个服务,它是另一个platofrm的扩展。因为我们是平台的扩展,所以我们无法控制发送给我们的请求的形状

平台向我们的API发送一个请求,该请求包含一个
“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”。可以传递的元数据属性没有绑定,因此希望对这些参数使用字典,但对服务强制发送的属性使用定义良好的参数。