Asp.net web api WebApi操作中的JObject参数为null

Asp.net web api WebApi操作中的JObject参数为null,asp.net-web-api,json.net,params,Asp.net Web Api,Json.net,Params,我有一个api控制器操作,它将JObject作为 public class ThemeController : ApiController { [HttpGet] public String Get(String siteName, JObject lessVariables) { public class ThemeController : Controller { [HttpPost] public String Post(String siteNa

我有一个api控制器操作,它将JObject作为

public class ThemeController : ApiController
{
    [HttpGet]
    public String Get(String siteName, JObject lessVariables)
    {
public class ThemeController : Controller
{
    [HttpPost]
    public String Post(String siteName, JObject lessVariables)
    {
还有一个ajax调用

$.ajax({
    url: '/api/Theme/Get',
    data: { lessVariables: JSON.stringify({'brand-primary': '#222222','brand-success': '#222222','brand-danger': '#222222','brand-info': '#222222','btn-primary-color': '#222222'}), siteName: "UnivOfUtah" }
    });
$.ajax({
    url: '/Theme/Post',
    data: { lessVariables: JSON.stringify({'brand-primary': '#222222','brand-success': '#222222','brand-danger': '#222222','brand-info': '#222222','btn-primary-color': '#222222'}), siteName: "UnivOfUtah" }
    });
当我查看HttpContext.Current.Request.Params[“lessVariables”]时,它给出了正确的json字符串,但lessVariables是一个空的JObject。我还需要做些什么来设置Json.Net吗

我也在一个常规的控制器操作上尝试过

我有一个控制器操作,它将JObject作为

public class ThemeController : ApiController
{
    [HttpGet]
    public String Get(String siteName, JObject lessVariables)
    {
public class ThemeController : Controller
{
    [HttpPost]
    public String Post(String siteName, JObject lessVariables)
    {
还有一个ajax调用

$.ajax({
    url: '/api/Theme/Get',
    data: { lessVariables: JSON.stringify({'brand-primary': '#222222','brand-success': '#222222','brand-danger': '#222222','brand-info': '#222222','btn-primary-color': '#222222'}), siteName: "UnivOfUtah" }
    });
$.ajax({
    url: '/Theme/Post',
    data: { lessVariables: JSON.stringify({'brand-primary': '#222222','brand-success': '#222222','brand-danger': '#222222','brand-info': '#222222','btn-primary-color': '#222222'}), siteName: "UnivOfUtah" }
    });

相同的结果

问题是
小变量
现在是一个字符串。整个结构可能看起来像:

{
    "lessVariables": "{'brand-primary': '#222222','brand-success': '#222222','brand-danger': '#222222','brand-info': '#222222','btn-primary-color': '#222222'}",
    "siteName": "UnivOfUtah"
}
这就是为什么您可以在参数中看到正确的字符串,但框架无法在不知道它是Json的情况下将其转换为JObject。当您对请求的根对象进行字符串化时,WebApi足够聪明,可以将其作为Json整体处理,但您对其中的值进行了字符串化,因此它不知道应该将其作为Json处理

要修复此问题,您可以使用模型绑定器或自定义操作进行自定义绑定,或者只需将方法更改为:

[HttpGet]
public String Get(String siteName, String lessVariables)
{
    JObject jo = JObject.Parse(lessVariables);
更新:

为了让问题更清楚,WebApi可以很好地解析这一点,但是
lessVariables
仍然是一个字符串:

[HttpGet]
public String Get(JObject rootObject)
{
    // you now have rootObject which has a "siteName" and "lessVariables" parameter
    var siteName = rootObject.GetValue("siteName");
    var lessVariables = rootObject.GetValue("lessVariables");
    // lessVariables.Type would return the JTokenType String

问题是
lessVariables
现在是一个字符串。整个结构可能看起来像:

{
    "lessVariables": "{'brand-primary': '#222222','brand-success': '#222222','brand-danger': '#222222','brand-info': '#222222','btn-primary-color': '#222222'}",
    "siteName": "UnivOfUtah"
}
这就是为什么您可以在参数中看到正确的字符串,但框架无法在不知道它是Json的情况下将其转换为JObject。当您对请求的根对象进行字符串化时,WebApi足够聪明,可以将其作为Json整体处理,但您对其中的值进行了字符串化,因此它不知道应该将其作为Json处理

要修复此问题,您可以使用模型绑定器或自定义操作进行自定义绑定,或者只需将方法更改为:

[HttpGet]
public String Get(String siteName, String lessVariables)
{
    JObject jo = JObject.Parse(lessVariables);
更新:

为了让问题更清楚,WebApi可以很好地解析这一点,但是
lessVariables
仍然是一个字符串:

[HttpGet]
public String Get(JObject rootObject)
{
    // you now have rootObject which has a "siteName" and "lessVariables" parameter
    var siteName = rootObject.GetValue("siteName");
    var lessVariables = rootObject.GetValue("lessVariables");
    // lessVariables.Type would return the JTokenType String

问题是
lessVariables
现在是一个字符串。整个结构可能看起来像:

{
    "lessVariables": "{'brand-primary': '#222222','brand-success': '#222222','brand-danger': '#222222','brand-info': '#222222','btn-primary-color': '#222222'}",
    "siteName": "UnivOfUtah"
}
这就是为什么您可以在参数中看到正确的字符串,但框架无法在不知道它是Json的情况下将其转换为JObject。当您对请求的根对象进行字符串化时,WebApi足够聪明,可以将其作为Json整体处理,但您对其中的值进行了字符串化,因此它不知道应该将其作为Json处理

要修复此问题,您可以使用模型绑定器或自定义操作进行自定义绑定,或者只需将方法更改为:

[HttpGet]
public String Get(String siteName, String lessVariables)
{
    JObject jo = JObject.Parse(lessVariables);
更新:

为了让问题更清楚,WebApi可以很好地解析这一点,但是
lessVariables
仍然是一个字符串:

[HttpGet]
public String Get(JObject rootObject)
{
    // you now have rootObject which has a "siteName" and "lessVariables" parameter
    var siteName = rootObject.GetValue("siteName");
    var lessVariables = rootObject.GetValue("lessVariables");
    // lessVariables.Type would return the JTokenType String

问题是
lessVariables
现在是一个字符串。整个结构可能看起来像:

{
    "lessVariables": "{'brand-primary': '#222222','brand-success': '#222222','brand-danger': '#222222','brand-info': '#222222','btn-primary-color': '#222222'}",
    "siteName": "UnivOfUtah"
}
这就是为什么您可以在参数中看到正确的字符串,但框架无法在不知道它是Json的情况下将其转换为JObject。当您对请求的根对象进行字符串化时,WebApi足够聪明,可以将其作为Json整体处理,但您对其中的值进行了字符串化,因此它不知道应该将其作为Json处理

要修复此问题,您可以使用模型绑定器或自定义操作进行自定义绑定,或者只需将方法更改为:

[HttpGet]
public String Get(String siteName, String lessVariables)
{
    JObject jo = JObject.Parse(lessVariables);
更新:

为了让问题更清楚,WebApi可以很好地解析这一点,但是
lessVariables
仍然是一个字符串:

[HttpGet]
public String Get(JObject rootObject)
{
    // you now have rootObject which has a "siteName" and "lessVariables" parameter
    var siteName = rootObject.GetValue("siteName");
    var lessVariables = rootObject.GetValue("lessVariables");
    // lessVariables.Type would return the JTokenType String

正如我所说的,这篇文章似乎有不同的想法,在你发布的链接中,它是被字符串化的根对象,非常有效。然而,在上面的问题中,它是根对象中的一个值;默认情况下,WebApi框架不会自动解析它,它只会尝试将lessVariables字符串分配给一个没有解析就无法工作的JObject。哦,我明白了。谢谢,我想我会处理这个问题。你也可以尝试删除lessVariables上的JSON.stringify并简单地放入原始JSON,尽管我不确定WebApi是否会自动对正文中的多个参数进行解析。正如我所说,这篇文章似乎不这么认为,在您发布的链接中,它是已字符串化的根对象,非常有效。然而,在上面的问题中,它是根对象中的一个值;默认情况下,WebApi框架不会自动解析它,它只会尝试将lessVariables字符串分配给一个没有解析就无法工作的JObject。哦,我明白了。谢谢,我想我会处理这个问题。你也可以尝试删除lessVariables上的JSON.stringify并简单地放入原始JSON,尽管我不确定WebApi是否会自动对正文中的多个参数进行解析。正如我所说,这篇文章似乎不这么认为,在您发布的链接中,它是已字符串化的根对象,非常有效。然而,在上面的问题中,它是根对象中的一个值;默认情况下,WebApi框架不会自动解析它,它只会尝试将lessVariables字符串分配给一个没有解析就无法工作的JObject。哦,我明白了。谢谢,我想我会处理这个问题。你也可以尝试删除lessVariables上的JSON.stringify并简单地放入原始JSON,尽管我不确定WebApi是否会自动对正文中的多个参数进行解析。正如我所说,这篇文章似乎不这么认为,在您发布的链接中,它是已字符串化的根对象,非常有效。然而,在上面的问题中,它是根对象中的一个值;默认情况下,WebApi框架不会自动解析它,它只会尝试将lessVariables字符串分配给一个没有解析就无法工作的JObject。哦,我明白了。谢谢,我想我会处理这个问题。你也可以尝试删除lessVariables上的JSON.stringify并简单地放入原始JSON,尽管我不确定WebApi是否会自动对正文中的多个参数进行解析。