在ASP.NET MVC中,我可以自动建模从POST主体到JObject的绑定模型吗?

时间:2016-12-23 20:36:48

标签: c# json asp.net-mvc json.net model-binding

我有一个控制器操作,它将JSON文档作为POST请求的主体。我希望通过模型绑定自动创建JObject,如下所示:

[HttpPost]
public ActionResult Index([FromBody] JObject data)
{
  // "data" is now a populated JObject object
}

但是我没有创建一个抽象类的错误。我试图从JObject扩展一些内容,但它也不会这样做。

我知道我可以阅读请求的正文并在其上调用JObject.Parse(我正在这样做,所以它确实有效),但我从上面的想法看起来更优雅。

这可能吗?

编辑:实际错误是:

System.MissingMethodException: Cannot create an abstract class.
[MissingMethodException: Cannot create an abstract class.]
System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
[Stack trace continues...]

请求永远不会进入控制器操作。

根据我的研究JObject不是抽象的,但为了确定,我这样做了:

public class Entry : JObject

然后

public ActionResult Index([FromBody] Entry data)

没用。同样的错误。

4 个答案:

答案 0 :(得分:2)

可能有两个问题。我改变了两件事,它现在有效,但我不能100%确定哪一个修好了。

以下是我改变的两件事 -

首先,我从Pool.map继承,而不仅仅是ApiController。我不确定这与它有什么关系。

其次,其他一个答案指出我需要Controller标题Content-Type。好吧,它不是。 application/json标题设置为特定于我们正在整合的软件的一些特殊值。

所以,在Content-Type中,我添加了这个:

Application_Start

然后它奏效了。

我怀疑这是修复它的第二件事。由于标题没有告诉模型绑定器它是传入的JSON,绑定器试图从头创建一个GlobalConfiguration.Configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("[crazy ass content-type header value]")); 对象并通过反射分配属性,这会导致问题JObject是抽象的。一旦它知道它正在处理JSON,它就知道只需要调用JToken

答案 1 :(得分:1)

我已为JToken编写了一个ASP.NET Core ModelBinder,您可以安装它 - https://github.com/mcintyre321/AspNetCoreJTokenModelBinder

绑定到JToken,然后在控制器中使用.ToObject<T>()

答案 2 :(得分:0)

您还应该在您的问题中加入JSON的结构。完整的请求会更好。在此之前,请尝试以下方法:

[FromBody] JObject data替换为[FromBody] dynamic data[FromBody] object data

并查看它是否在行动的第一行遇到断点。

如果是,请查看您的动态实际是什么(类型)。

如果没有,则POST请求可能没有Content-Type: application/json

答案 3 :(得分:0)

问题在于,在反序列化到JObject类型的某个时刻,它会调用创建一个`JToken&#39;这就是引发异常的地方。这是一个确切的例外:

  

无法创建抽象类。对象类型   Newtonsoft.Json.Linq.JToken