2017-08-19 4 views
-1

私はajax呼び出しを使用して車両の詳細を取得しています。だから私はエラー "文字列の長さがmaxjsonlengthプロパティに設定された値を超えている"を取得するコントローラからビューの旅行の詳細を返す間。文字列の長さがmvcのmaxjsonlengthプロパティで設定された値を超えています

以下は、私が旅行の詳細を取得するために使用しているajaxコールです。旅行の詳細が巨大なときはいつでも、エラー機能に行く。

function LoadTripModalWindow(masterID, headwayPlanID, version, specialDay, applicableDay) { 
 
     //change this value after cpp service implementation 
 
     //version = 1; 
 
     ///////////////// 
 
     if (headwayPlanID == 0 || headwayPlanID == null) { 
 
      $('#HeadwayPopUp').hide(); 
 
      $('#NoTripGenerated').hide(); 
 
      $('#NoHeadwayPopUp').show(); 
 
     } 
 
     else { 
 
      $('#tripDialogDiv').hide(); 
 
      $('#NoHeadwayPopUp').hide(); 
 
      $.blockUI({ message: $('#msthrobber') }); 
 
      var tripIn = ''; 
 
      tripIn = '<table class="table table-bordered trip" id="tripInTableMS"> </table>'; 
 
      $("#tripInTableMS").remove(); 
 
      $("#TripIn").append(tripIn); 
 
      var tripOut = ''; 
 
      tripOut = '<table class="table table-bordered trip" id="tripOutTableMS"> </table>'; 
 
      $("#tripOutTableMS").remove(); 
 
      $("#TripOut").append(tripOut); 
 
      $.ajax({ 
 
       type: "GET", 
 
       url: "/ScheduleManagement/MasterConfiguration/GetTripTableDetails/", 
 
       data: { version: version, masterScheduleID: masterID, headwayPlanId: headwayPlanID, applicableDay: applicableDay, specialDay: specialDay }, 
 
       dataType: "json", 
 
       context: this, 
 
       success: function (data) { 
 
        var returnedData = JSON.parse(data); 
 
        var tripIn = returnedData.TripIn; 
 
        var tripOut = returnedData.TripOut; 
 
        var TripInHeadwayPlan = returnedData.TripInHeadwayPlan; 
 
        var TripOutHeadwayPlan = returnedData.TripOutHeadwayPlan; 
 
        var TripInRoute = returnedData.TripInRoute; 
 
        var TripOutRoute = returnedData.TripOutRoute; 
 
        var ShiftDetails = returnedData.AssignedShifts; 
 
        if ((tripIn == null || tripIn.length == 0) && (tripOut == null || tripOut.length == 0)) { 
 
         //if (tripIn == null && tripOut == null) { 
 

 
         $.unblockUI(); 
 
         $('#tripDialogDiv').show(); 
 
         $('#HeadwayPopUp').hide(); 
 
         $('#NoTripGenerated').show(); 
 
        } 
 
        else { 
 
         var shiftDetail = '<label"> Shift Details :</label>&nbsp;&nbsp;&nbsp;'; 
 
         for (var s = 0; s < ShiftDetails.length; s++) { 
 
          shiftDetail += '&nbsp;<input type="text" class="shift-details Shift' + (parseInt(s) + 1) + ' " disabled>' + 
 
          '<label style="color: slategrey;">' + ShiftDetails[s].shiftName + '(' + ShiftDetails[s].startTime.substring(0, 5) + ' - ' + ShiftDetails[s].endTime.substring(0, 5) + ')</label> &nbsp; &nbsp;'; 
 
         } 
 
         $("#ShiftDetails").html(''); 
 
         $("#ShiftDetails").append(shiftDetail); 
 
         if (tripIn != null) { 
 
          var tripInTable = new triptable('tripInTableMS', '0', 'btnAddCol1', 'btnTripSave', 'btnTrip1Remove', tripIn, TripInHeadwayPlan, TripInRoute, TripOutRoute, ShiftDetails); 
 
         } 
 
         if (tripOut != null) { 
 
          var tripOutTable = new triptable('tripOutTableMS', '1', 'btnAddCol2', 'btnTripSave', 'btnTrip2Remove', tripOut, TripOutHeadwayPlan, TripInRoute, TripOutRoute, ShiftDetails); 
 
         } 
 
         $.unblockUI(); 
 
         $('#tripDialogDiv').show(); 
 
         $('#HeadwayPopUp').show(); 
 
         $('#NoTripGenerated').hide(); 
 
         $("#TripInBox").show(); 
 
         $("#TripOutBox").hide(); 
 
        } 
 
       }, 
 
       error: function (response) { 
 
        alert("error : " + response); 
 
       } 
 
      }); 
 
     } 
 
    }

私は自分のアプリケーションのコードの下に追加されました。

private static void AddToBackingStore(JsonDotNetValueProviderFactory.EntryLimitedDictionary backingStore, string prefix, object value) 
 
     { 
 
      IDictionary<string, object> dictionary = value as IDictionary<string, object>; 
 
      if (dictionary != null) 
 
      { 
 
       foreach (KeyValuePair<string, object> keyValuePair in (IEnumerable<KeyValuePair<string, object>>)dictionary) 
 
        JsonDotNetValueProviderFactory.AddToBackingStore(backingStore, JsonDotNetValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value); 
 
      } 
 
      else 
 
      { 
 
       IList list = value as IList; 
 
       if (list != null) 
 
       { 
 
        for (int index = 0; index < list.Count; ++index) 
 
         JsonDotNetValueProviderFactory.AddToBackingStore(backingStore, JsonDotNetValueProviderFactory.MakeArrayKey(prefix, index), list[index]); 
 
       } 
 
       else 
 
        backingStore.Add(prefix, value); 
 
      } 
 
     } 
 

 
     private static object GetDeserializedObject(ControllerContext controllerContext) 
 
     { 
 
      if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) 
 
       return (object)null; 
 
      string end = new StreamReader(controllerContext.HttpContext.Request.InputStream).ReadToEnd(); 
 
      if (string.IsNullOrEmpty(end)) 
 
       return (object)null; 
 

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

 
      return serializer.DeserializeObject(end); 
 
     } 
 
     public override IValueProvider GetValueProvider(ControllerContext controllerContext) 
 
     { 
 
      if (controllerContext == null) 
 
       throw new ArgumentNullException("controllerContext"); 
 
      object deserializedObject = JsonDotNetValueProviderFactory.GetDeserializedObject(controllerContext); 
 
      if (deserializedObject == null) 
 
       return (IValueProvider)null; 
 
      Dictionary<string, object> dictionary = new Dictionary<string, object>((IEqualityComparer<string>)StringComparer.OrdinalIgnoreCase); 
 
      JsonDotNetValueProviderFactory.AddToBackingStore(new JsonDotNetValueProviderFactory.EntryLimitedDictionary((IDictionary<string, object>)dictionary), string.Empty, deserializedObject); 
 
      return (IValueProvider)new DictionaryValueProvider<object>((IDictionary<string, object>)dictionary, CultureInfo.CurrentCulture); 
 

 
     } 
 
     private static string MakeArrayKey(string prefix, int index) 
 
     { 
 
      return prefix + "[" + index.ToString((IFormatProvider)CultureInfo.InvariantCulture) + "]"; 
 
     } 
 

 
     private static string MakePropertyKey(string prefix, string propertyName) 
 
     { 
 
      if (!string.IsNullOrEmpty(prefix)) 
 
       return prefix + "." + propertyName; 
 
      return propertyName; 
 
     } 
 

 
     private class EntryLimitedDictionary 
 
     { 
 
      private static int _maximumDepth = JsonDotNetValueProviderFactory.EntryLimitedDictionary.GetMaximumDepth(); 
 
      private readonly IDictionary<string, object> _innerDictionary; 
 
      private int _itemCount; 
 

 
      public EntryLimitedDictionary(IDictionary<string, object> innerDictionary) 
 
      { 
 
       this._innerDictionary = innerDictionary; 
 
      } 
 

 
      public void Add(string key, object value) 
 
      { 
 
       if (++this._itemCount > JsonDotNetValueProviderFactory.EntryLimitedDictionary._maximumDepth) 
 
        throw new InvalidOperationException("JsonValueProviderFactory_RequestTooLarge"); 
 
       this._innerDictionary.Add(key, value); 
 
      } 
 

 
      private static int GetMaximumDepth() 
 
      { 
 
       NameValueCollection appSettings = ConfigurationManager.AppSettings; 
 
       if (appSettings != null) 
 
       { 
 
        string[] values = appSettings.GetValues("aspnet:MaxJsonDeserializerMembers"); 
 
        int result; 
 
        if (values != null && values.Length > 0 && int.TryParse(values[0], out result)) 
 
         return result; 
 
       } 
 
       return 1000; 
 
      } 
 
     }

そしてglobal.ascxファイルで、私はそれが数ヶ月の罰金働いていたライン

foreach (var factory in ValueProviderFactories.Factories) 
 
      { 
 
       if (factory.GetType().FullName == "System.Web.Mvc.JsonValueProviderFactory") 
 
       { 
 
        jsonFactory = factory; 
 
        break; 
 
       } 
 
      } 
 

 
      if (jsonFactory != null) 
 
      { 
 
       ValueProviderFactories.Factories.Remove(jsonFactory); 
 
      } 
 

 
      ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory());

の下に追加されました。もう一度データの長さが増え、再びエラーが発生するようになりました。

この問題を解決するための提案があれば教えてください。

+0

を参照してください申し訳ありません..私は私の質問を完了するのに逃しました。今更新しました。今すぐチェックしてください – vIDHU

+0

JavaScriptSerializer中に[MaxJsonLength exception in ASP.NET MVC]の可能な複製(https://stackoverflow.com/questions/5692836/maxjsonlength-exception-in-asp-net-mvc-during-javascriptserializer) – mjwills

答えて

2

Json結果には、デフォルトの長さがあります。それを超えるたびに、それは上記のエラーを投げます。

この場合、web.congigに長さを追加するか、アクションメソッドが長さを定義する間に2つの方法があります。 のWeb.config

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

または戻り化するJsonResultしばらく

、あなたの文字列の最大長と長さを定義します。

return new JsonResult() 
      { 
       ContentEncoding = Encoding.Default, 
       ContentType = "application/json", 
       Data = data, 
       JsonRequestBehavior = requestBehavior, 
       MaxJsonLength = int.MaxValue 
      }; 

The length of the string exceeds the value set on the maxJsonLength property

Can I set an unlimited length for maxJsonLength in web.config?

+0

ありがとうたくさん..今はうまくいっています。 :) – vIDHU

関連する問題