JObject 参数在 WebApi Action 中为 null



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

相同的结果

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

相关内容

  • 没有找到相关文章

最新更新