我有一个 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