这是设置:
我有一些 MVC 控制器,旨在由 jQuery ajax 请求使用。一个正常的请求看起来有点像这样:
$.ajax("/Solicitor/AddSolicitorToApplication", {
data: putData,
type: "POST", contentType: "application/json",
success: function (result) {
//My success callback
}
}
});
我的控制器看起来像这样:
[HttpPost]
public ActionResult InsertLoanApplication(MortgageLoanApplicationViewModel vm)
{
var mortgageLoanDTO = vm.MapToDTO();
return Json(_mortgageLoanService.UpdateMortgageLoanApplication(mortgageLoanDTO), JsonRequestBehavior.DenyGet);
}
对于传递到控制器的大多数对象来说,这完全可以正常工作,但在这种特定情况下,传递的对象的属性之一需要以特定方式反序列化。
我添加了一个之前与 MVC4 Web API 一起使用的 JsonConverter,但在本例中我需要将其应用到常规 mvc 控制器。
我尝试在我的 global.asax 中注册 JsonConverter,如下所示:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new GrizlyStringConverter());
但到目前为止还无法反序列化该对象。
你应该更换内置的JsonValueProviderFactory http://msdn.microsoft.com/en-us/library/system.web.mvc.jsonvalueproviderfactory%28v=vs.98%29.aspx如果您想使用,请使用自定义类Json.NET
将 JSON 请求绑定到视图模型时。
您可以编写一个,如下所示这个要点 https://gist.github.com/1588818:
public sealed class JsonDotNetValueProviderFactory : ValueProviderFactory
{
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
{
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
}
if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
{
return null;
}
using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream))
{
var bodyText = reader.ReadToEnd();
return String.IsNullOrEmpty(bodyText)
? null :
new DictionaryValueProvider<object>(
JsonConvert.DeserializeObject<ExpandoObject>(
bodyText,
new ExpandoObjectConverter()
),
CultureInfo.CurrentCulture
);
}
}
}
然后将内置的替换为您自定义的Application_Start
:
ValueProviderFactories.Factories.Remove(
ValueProviderFactories
.Factories
.OfType<JsonValueProviderFactory>()
.FirstOrDefault()
);
ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory());
就是这样。现在,您使用 Json.Net 而不是 JavaScriptSerializer 来处理传入的 JSON 请求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)