我有一个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" }
});
相同的结果
答案 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