将嵌套的 x-form-urlencoded 数据映射到 Asp.NET Core 中的 DTO

Mapping nested x-form-urlencoded data to DTO in Asp.NET Core

在 Asp.Net 核心中实现一个 webhook,该核心 POST 使用 application/x-form-urlencoded 数据进行编辑 - 它正在以一种设计为易于在 [=36= 中处理的格式接收数据] w/ $_POST 变量(嵌套关联数组)- 表单字段看起来像

foo
bar[barf]
baz[bat][bark]
baz[bat][bant]

是否有一个很好的(优雅且需要很少的代码)方法来连接 Asp.NET 核心模型绑定以处理此处的嵌套结构?即当 webhook 被 POSTed 时,我们解析 C# POCO -

类似

class RootDto {
    public string Foo {get; set;}

    public Bar Bar {get; set;}
    public Baz Baz {get; set;}

    public class Bar {
        public string Barf {get; set;}
    }

    public class Baz {
        public Bat Bat {get; set;}

        public class Bat {
            public string Bark {get; set;}
            public string Bant {get; set;}
        }
    }
}

POST 正文如下所示:

foo=somevalue&bar%5Bbarf%5D=anothervalue&baz%5Bbat%5D%5Bbark%5D=123.0&baz%5Bbat%5D%5Bbant%5D=5000

foo=somevalue&bar[barf]=anothervalue&baz[bat][bark]=123.0&baz[bat][bant]=5000

此外,为这些字段之一设置类型转换器的低摩擦方法是什么(例如,假设字段 "Foo" 作为字符串出现,但我们想将其解析为结构) ?

请注意,我无法控制来自 webhook 的数据的形状或编码(例如,我不能请求他们直接发送给我 JSON)。

请求正文

Content-Type: application/x-www-form-urlencoded

foo=somevalue&bar%5Bbarf%5D=anothervalue&baz%5Bbat%5D%5Bbark%5D=123.0&baz%5Bbat%5D%5Bbant%5D=5000

它很管用....我有普通的 .net 核心项目和控制器看起来像

  public IActionResult Post([FromForm] RootDto request)
        {
            return Ok(request);
        }

顺便说一句,你的根 class 似乎是错误的我已经更改以使其工作

public class RootDto {
    public string Foo {get; set;}

    public BarClass Bar {get; set;}
    public BazClass Baz {get; set;}

    public class BarClass {
        public string Barf {get; set;}
    }

    public class BazClass {
        public BatClass Bat {get; set;}

        public class BatClass {
            public string Bark {get; set;}
            public string Bant {get; set;}
        }
    }
}