2013-12-03 2 views
1

Я добавил Newton Soft к смешиванию и я использую этот блог в качестве шаблона: http://wingkaiwan.com/2012/12/28/replacing-mvc-javascriptserializer-with-json-net-jsonserializer/Ошибка во время сериализации с использованием JSON JavaScriptSerializer. Должно быть, используя Json.NET JsonSerializer

теперь у меня есть:

public class BaseJsonController : BaseController 
{ 
    protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior) 
    { 
     return new JsonNetResult 
     { 
      Data = data, 
      ContentType = contentType, 
      ContentEncoding = contentEncoding, 
      JsonRequestBehavior = behavior 
     }; 
    } 
} 

public class JsonNetResult : JsonResult 
{ 
    public JsonNetResult() 
    { 
     Settings = new JsonSerializerSettings 
     { 
      ReferenceLoopHandling = ReferenceLoopHandling.Error 
     }; 
    } 

    public JsonSerializerSettings Settings { get; private set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException("context"); 
     if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) 
      throw new InvalidOperationException("JSON GET is not allowed"); 

     HttpResponseBase response = context.HttpContext.Response; 
     response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType; 

     if (this.ContentEncoding != null) 
      response.ContentEncoding = this.ContentEncoding; 
     if (this.Data == null) 
      return; 

     var scriptSerializer = JsonSerializer.Create(this.Settings); 

     using (var sw = new StringWriter()) 
     { 
      scriptSerializer.Serialize(sw, this.Data); 
      response.Write(sw.ToString()); 
     } 
    } 
} 

Сейчас, на мой контроллер I сделал это:

[HandleError] 
public class ProcurementActionsController : BaseJsonController 
{ 
    ... 

    [GridAction] 
    [AcceptVerbs(HttpVerbs.Post)] 
    public JsonResult AjaxGetAll(string pageFilter = null, string searchTerm = null) 
    { 
     var rawData = GetProcurementActions(pageFilter); 
     return new JsonNetResult 
     { 
      Data = new GridModel { Data = rawData }, 
      JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
      Settings = { ReferenceLoopHandling = ReferenceLoopHandling.Ignore } 
     }; 
    } 

    ... 

} 

Однако, я все еще получаю такую ​​же ошибку! По трассировки стека он все еще пытается использовать JavaScriptSerializer вместо JsonSerializer:

[InvalidOperationException: Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property.] 
    System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj, StringBuilder output, SerializationFormat serializationFormat) +188 
    System.Web.Script.Serialization.JavaScriptSerializer.Serialize(Object obj) +56 
    System.Web.Mvc.JsonResult.ExecuteResult(ControllerContext context) +418 
    System.Web.Mvc.<>c__DisplayClass14.<InvokeActionResultWithFilters>b__11() +31 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +656883 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +656883 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +254 
    System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +658100 
    System.Web.Mvc.Controller.ExecuteCore() +125 
    System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +48 
    System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21 
    System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +15 
    System.Web.Mvc.Async.WrappedAsyncResult`1.End() +85 
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +51 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +454 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +263 

Является ли это из-за вызова асинхронным? Если да, то что мне нужно переопределить в моем BaseJsonController, чтобы заставить это вызвать правильный метод ExecuteResult (...)?

ответ

0
[GridAction] 
    [AcceptVerbs(HttpVerbs.Post)] 
    public JsonResult AjaxGetAll(string pageFilter = null, string searchTerm = null) 
    { 
     var rawData = GetProcurementActions(pageFilter); 
     var gridData = new GridModel { Data = rawData }; 
     var json = JsonConvert.SerializeObject(gridData).Replace("\"Total\":0,\"Aggregates\":null", String.Format("\"Total\":{0},\"Aggregates\":null", rawData.Count)); 

     return new ContentResult { Content = json, ContentType = "application/json" }; 
    } 
  1. Получить данные из БД.
  2. Необходимо преобразовать ViewModel (List) в объект GridModel Telerik.
  3. Используйте JsonSerializer от Newton Soft, чтобы преобразовать GridModel в строку JSON (здесь нет ограничений на длину!). Telerik Grid должна знать общие записи и по какой-то причине это не было в JSON. Обновите его с помощью метода Replace().
  4. Используйте объект ContentResult вместо ActionResult или JsonResult. С помощью этого вы можете определить свою собственную полезную нагрузку.

Единственный недостаток этого точного решения заключается в том, что он, наконец, достигает около 4 ГБ. В этот момент это, вероятно, приведет к краху большинства браузеров, если у вас нет способа вернуть результат. Я бы добавил проверку на максимальную длину и забросил ошибку.

0

В MVC 4 и 5 это должно быть легко зафиксировано параметром в файле веб-конфигурации.

У меня была такая же проблема в MVC3 и просто установил его, заменив ValueProviderFactories в app_start, следуя этой теме:

http://forums.asp.net/t/1751116.aspx

+0

Я действительно добавлял этот код в нашу базу кода. Однако это для входящего JSON, и я пытаюсь решить для исходящего JSON. Я нашел другой способ выполнить это (см. Мой ответ ниже) ... –

Смежные вопросы