【发布时间】: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