2011-04-17 33 views
97

在我的一個控制器操作中,我返回一個非常大的JsonResult以填充網格。JavaScriptSerializer期間ASP.NET MVC中的MaxJsonLength異常

我正在以下InvalidOperationException例外:

錯誤序列化或反序列化過程中使用JSON JavaScriptSerializer。字符串的長度超過maxJsonLength屬性中設置的值。

web.config中的maxJsonLength屬性設置爲更高的值,遺憾的是沒有顯示任何效果。

<system.web.extensions> 
    <scripting> 
    <webServices> 
     <jsonSerialization maxJsonLength="2147483644"/> 
    </webServices> 
    </scripting> 
</system.web.extensions> 

我不想傳回的字符串作爲this提到的SO回答。

在我的研究橫跨this博客文章來的地方寫一個自己的ActionResult(例如LargeJsonResult : JsonResult)建議繞過此行爲。

這是唯一的解決方案嗎?
這是ASP.NET MVC中的錯誤嗎?
我錯過了什麼嗎?

任何幫助將不勝感激。

+2

你的解決方案,適用於MVC 3 – MatteoSp 2013-04-09 19:31:53

+1

@Matteo確定配置元素?這是一個古老的問題,我不記得但顯然我把它標記爲MVC3。不幸的是,當它修復/關閉時,我無法看到版本/日期:https://aspnet.codeplex.com/workitem/3436 – 2013-04-10 04:35:08

+1

當然,我正在使用MVC 3,它的工作原理。幸運的是,因爲在MVC 3中,您沒有在接受的答案中引用的「MaxJsonLength」屬性。 – MatteoSp 2013-04-11 10:41:59

回答

174

看來這已在MVC4中修復。

你可以做到這一點,這對我來說效果很好:

public ActionResult SomeControllerAction() 
{ 
    var jsonResult = Json(veryLargeCollection, JsonRequestBehavior.AllowGet); 
    jsonResult.MaxJsonLength = int.MaxValue; 
    return jsonResult; 
} 
+1

很好的答案!謝謝! – 2013-01-04 15:17:09

+0

我將json字符串設置到ViewBag.MyJsonString屬性中,但在運行時在我的視圖中出現了與以下javascript行相同的錯誤: var myJsonObj = @ Html.Raw(Json.Encode(ViewBag.MyJsonString)); – 2013-09-05 12:13:52

+1

嘿@orionedvards,@ GG,@ MartinBuberl我面臨着同樣的問題maxJson但發佈數據時,控制器,我怎麼能解決這個問題,我花了這麼多的時間來搜索這個。任何幫助,將不勝感激。 – katmanco 2015-03-03 22:37:30

31

您也可以使用ContentResult作爲suggested here而不是子類JsonResult

var serializer = new JavaScriptSerializer { MaxJsonLength = Int32.MaxValue, RecursionLimit = 100 }; 

return new ContentResult() 
{ 
    Content = serializer.Serialize(data), 
    ContentType = "application/json", 
}; 
+1

在我的情況下,工作在一次性應用程序上,這個解決方案對我來說最合適。保存實現jsonresult。謝謝! – Christo 2012-09-15 22:35:35

18

無需自定義類。這就是需要的全部內容:

return new JsonResult { Data = Result, MaxJsonLength = Int32.MaxValue }; 

其中Result是您希望序列化的數據。

+0

錯誤「System.Web.Mvc.JsonResult」不包含「MaxJsonLength」 – PUG 2013-06-17 20:49:48

+0

你在哪裏得到這個錯誤的定義? – John 2013-06-18 01:07:53

+0

c#.net mvc3 ...... – PUG 2013-06-18 04:45:16

2

您可以嘗試在您的LINQ表達式中只定義您需要的字段。

例子。想象一下,你有一個模型與Id,名稱,電話和圖片(字節數組),並需要從json加載到選擇列表。

LINQ查詢:

var listItems = (from u in Users where u.name.Contains(term) select u).ToList(); 

這裏的問題是 「選擇ü」 是讓所有領域。所以,如果你有大照片,booomm。

如何解決?非常非常簡單。

var listItems = (from u in Users where u.name.Contains(term) select new {u.Id, u.Name}).ToList(); 

最佳實踐是隻選擇您將使用的字段。

請記住。這是一個簡單的提示,但可以幫助許多ASP.NET MVC開發人員。

+0

我不認爲在這種情況下,用戶想要過濾他們的數據。有些人需要從數據庫中取回大量的行...... – 2016-05-31 16:31:12

4

如果使用Json.NET來生成json字符串,則不需要設置MaxJsonLength的值。

return new ContentResult() 
{ 
    Content = Newtonsoft.Json.JsonConvert.SerializeObject(data), 
    ContentType = "application/json", 
}; 
3

我按照這個link

namespace System.Web.Mvc 
{ 
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; 

     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); 
    } 
} 

} 

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     //Remove and JsonValueProviderFactory and add JsonDotNetValueProviderFactory 
     ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault()); 
     ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory()); 
    } 
0

你需要從配置部分之前手動代碼返回一個JsonResult對象讀取解決的問題。只需從單線web.config中閱讀:

 var jsonResult = Json(resultsForAjaxUI); 
     jsonResult.MaxJsonLength = (ConfigurationManager.GetSection("system.web.extensions/scripting/webServices/jsonSerialization") as System.Web.Configuration.ScriptingJsonSerializationSection).MaxJsonLength; 
     return jsonResult; 

要確保你定義在web.config中