【问题标题】:JObject parameter is null in WebApi ActionWebApi Action 中的 JObject 参数为空
【发布时间】:2014-01-13 17:43:13
【问题描述】:

我有一个 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" }
    });

同样的结果

【问题讨论】:

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


    【解决方案1】:

    问题是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
    

    【讨论】:

    • 这篇文章似乎不这么认为stackoverflow.com/questions/12730280/…
    • 正如我所说,在您发布的链接中,它是已字符串化的根对象,效果很好。但是,在上面的问题中,它是根对象内的值;默认情况下,WebApi 框架不会自动解析它,它只会尝试将 lessVariables 字符串分配给一个 JObject ,如果不解析就无法工作。
    • 哦,我明白了。谢谢,我想我会继续工作的。
    • 您也可以尝试删除 lessVariables 上的 JSON.stringify 并简单地放置原始 Json,但我不确定 WebApi 是否会自动解析 Body 中的多个参数。
    猜你喜欢
    • 1970-01-01
    • 2016-09-06
    • 2016-01-27
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多