Web Api Action中的JObject参数为null

时间:2014-01-13 17:43:13

标签: asp.net-web-api json.net params

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

public class ThemeController : ApiController
{
    [HttpGet]
    public String Get(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" }
    });

当我查看HttpContext.Current.Request.Params [“lessVariables”]时,它给出了正确的json字符串,但lessVariables是一个空的JObject。我还需要做些什么来为此设置Json.Net吗?

我也在常规控制器操作上尝试过它

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

public class ThemeController : Controller
{
    [HttpPost]
    public String Post(String siteName, JObject lessVariables)
    {

和ajax电话

$.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" }
    });

相同的结果

1 个答案:

答案 0 :(得分:2)

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

{
    "lessVariables": "{'brand-primary': '#222222','brand-success': '#222222','brand-danger': '#222222','brand-info': '#222222','btn-primary-color': '#222222'}",
    "siteName": "UnivOfUtah"
}

这就是为什么你可以在Params中看到正确的字符串,但是框架无法在不知道它是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