【问题标题】:How to bind dynamic object in .NET Core 5?如何在 .NET Core 5 中绑定动态对象?
【发布时间】:2021-09-21 03:11:37
【问题描述】:

刚刚阅读了一些关于此的 SO 主题,但似乎没有任何效果。

简单地说我发布一个对象如下:

{
    "Name" : "TestName",
    "Other" : { "item":"test" }
}

控制器动作看起来这个控制器是ApiController

[HttpPost]
public ActionResult Post(string name, dynamic other)
{}

似乎无法将其他绑定作为动态对象。断点显示其他中有ValueKind。似乎仍然无法通过Other.item 读取项目值。

必须遗漏一些简单但不确定的内容。

编辑

似乎每个人都建议使用强类型对象。

问题是在输入值之前我不知道这些值。举个例子:

{
"ItemCount":1,
items:[{
"name":"item",
"price":5
}]
}

这是一个模板系统。模板系统的工作在这里并不重要,但重要的是用户可以决定像 ItemCount 这样的字段名称可以是他们想要的任何名称,与 items Array 相同,他们可以称之为 things/cart。

我相信在这种情况下它必须是一个动态对象。不过,欢迎提出建议。

【问题讨论】:

  • 但是为什么呢?为什么不只是Dictionary<string,string> other?或者如果你知道这个东西会有一个.item 属性,定义一个新的类/结构。
  • 我不知道。 Dictionary 是否仅适用于顶级?如果我有内部对象怎么办?
  • 恕我直言,您应该确切地知道您期望什么数据,因此应该定义一个类来表示该数据(class Data{string Name; OtherData Other;} class OtherData{string Item;} 等)。或者你什么都不知道,因为你只是在其他地方盲目地传递数据,在这种情况下你可能会绑定JObject
  • 这是对象不知道的情况。正如您所说,我通常会创建强类型对象,但有时取决于大型系统的复杂性,您根本无法做到。无论如何,奇怪的事情用 Newtonsoft 替换了 System.Text.Json,一切似乎都按预期工作。也许 System.Text.Json 不支持正确的绑定。
  • dynamic 不是类型。这是一个告诉编译器将任何绑定推迟到运行时的关键字。 ASP.NET Web API 中没有“动态”类型的概念。 API 的用户如何知道要传入什么类型?

标签: c# asp.net-core asp.net-web-api


【解决方案1】:

唯一的方法是使用 JObject 或 JArray

[HttpPost]
public ActionResult Post(JObject model)
{
var name = model.SelectToken("Name").ToString();
.... and so on
}

但我真的无法想象为什么有人需要在控制器动作中使用动态对象。这就是它不受支持的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2011-02-11
    相关资源
    最近更新 更多