具有特定 JsonConverter 的 MVC3 控制器

amh*_*hed 2 asp.net-mvc serialization json

这是设置:

我有一些 MVC 控制器,旨在由 jQuery ajax 请求使用。一个正常的请求看起来有点像这样:

$.ajax("/Solicitor/AddSolicitorToApplication", {
    data: putData,
    type: "POST", contentType: "application/json",
    success: function (result) {
       //My success callback
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

我的控制器看起来像这样:

[HttpPost]
public ActionResult InsertLoanApplication(MortgageLoanApplicationViewModel vm)
{
   var mortgageLoanDTO = vm.MapToDTO();
   return Json(_mortgageLoanService.UpdateMortgageLoanApplication(mortgageLoanDTO),   JsonRequestBehavior.DenyGet);
}
Run Code Online (Sandbox Code Playgroud)

对于传递到控制器的大多数对象来说,这完全可以正常工作,但在这种特定情况下,传递的对象的属性之一需要以特定方式反序列化。

我添加了一个之前与 MVC4 Web API 一起使用的 JsonConverter,但在本例中我需要将其应用到常规 mvc 控制器。

我尝试在我的 global.asax 中注册 JsonConverter,如下所示:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new GrizlyStringConverter());
Run Code Online (Sandbox Code Playgroud)

但到目前为止还无法反序列化该对象。

Dar*_*rov 5

JsonValueProviderFactory如果您想在Json.NET将 JSON 请求绑定到视图模型时使用,您应该将内置类替换为自定义类。

您可以编写一个,如下要点所示:

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
                );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将内置的替换为您的自定义的Application_Start

ValueProviderFactories.Factories.Remove(
    ValueProviderFactories
        .Factories
        .OfType<JsonValueProviderFactory>()
        .FirstOrDefault()
);
ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory());
Run Code Online (Sandbox Code Playgroud)

就是这样。现在,您使用 Json.Net 而不是 JavaScriptSerializer 来处理传入的 JSON 请求。