【发布时间】:2016-08-21 19:16:48
【问题描述】:
有没有办法让 MVC 控制器将传入的动态 JSON 绑定到 JToken 对象?
如果我使用 API 控制器,我可以这样做:
public class TestController : ApiController
{
public void Post(JToken json)
{
}
}
并且发布的 json 被转换为 JToken 对象。
但是,如果我使用 MVC 控制器,则会导致服务器错误。
public class TestController : Controller
{
[HttpPost]
public ActionResult TestAction(JToken json)
{
return new HttpStatusCodeResult(HttpStatusCode.OK);
}
}
我意识到还有其他方法可以获取传入数据,但我更愿意在 MVC 控制器中将其作为 JToken 接收。
我尝试使用自定义 ValueProviderFactory from here,但我的 AJAX 调用仍然返回服务器错误:
$.ajax({
url: '/Test/TestAction', //or /api/Test
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({foo:"bar",wibble:"wobble"})
}).done(function (res) {
alert('ok');
}).fail(function (xhr, status, error) {
alert('error')
});
更新:
注意 - 如上所述,我已将默认 JsonValueProviderFactory 替换为基于 Json.NET 的@。
经过进一步调查,问题似乎出现在DefaultModelBinder.CreateModel 方法中。当DefaultModelBinder 尝试创建JToken 实例时它会失败,因为JToken 是一个抽象类。即使我将TestAction 参数更改为JObject,它仍然会失败,可能是因为在对象层次结构中还有JToken 属性。
【问题讨论】:
-
您的 JToken 类是否具有 foo 和 wibble 属性?
-
@Karthik 这是Json.NET JToken Class
-
好的。该类是否包含 foo 和 wibble 属性?
-
ASP.Net MVC 使用
JavaScriptSerializer而不是 Json.NET。要切换,请参阅 Setting the Default JSON Serializer in ASP.NET MVC 和 How to use Json.NET for JSON modelbinding in an MVC5 project?。 -
@dbc 谢谢,Jason Butera 在您的第二个链接中的回答提供了解决方案,我还需要创建一个基于 Json.NET 的自定义 ModelBinder。你想提供一个答案,我会接受它还是我应该展示解决方案?
标签: asp.net asp.net-mvc asp.net-web-api asp.net-mvc-5 json.net