Is there a way I can get an MVC controller to bind incoming dynamic JSON to a JToken object?
If I use an API Controller I can do this:
public class TestController : ApiController
{
public void Post(JToken json)
{
}
}
and the posted json gets converted into a JToken object.
However if I use an MVC controller it results in a server error.
public class TestController : Controller
{
[HttpPost]
public ActionResult TestAction(JToken json)
{
return new HttpStatusCodeResult(HttpStatusCode.OK);
}
}
I realise there other ways to obtain the incoming data but I would prefer to receive it as a JToken in the MVC Controller.
I have tried to use a custom ValueProviderFactory from here but I still get a server error returned from my AJAX call:
$.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')
});
UPDATE:
Note - As stated above I have replaced the default JsonValueProviderFactory with one based on Json.NET.
On further investigation it appears that the problem occurs in the DefaultModelBinder.CreateModel method. When the DefaultModelBinder tries to create a JToken instance it fails because JToken is an abstract class. Even if I change the TestAction parameter to a JObject it stills fails, presumably because there are JToken properties further down the object heirarchy.
JavaScriptSerializernot Json.NET. To switch, see Setting the Default JSON Serializer in ASP.NET MVC and How to use Json.NET for JSON modelbinding in an MVC5 project?.