В одном из действий контроллера я возвращаю очень большой JsonResult
размер, чтобы заполнить сетку.
Я получаю следующее InvalidOperationException
исключение:
Ошибка при сериализации или десериализации с помощью JSON JavaScriptSerializer. Длина строки превышает значение, установленное в свойстве maxJsonLength.
Установка более высокого значения для maxJsonLength
свойства, web.config
к сожалению, не дает никакого эффекта.
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483644"/>
</webServices>
</scripting>
</system.web.extensions>
Я не хочу передавать его обратно в виде строки, как указано в этом ответе SO.
В своем исследовании я наткнулся на это сообщение в блоге, где рекомендуется написать собственное ActionResult
(например LargeJsonResult : JsonResult
), чтобы обойти такое поведение.
Тогда это единственное решение?
Это ошибка в ASP.NET MVC?
Я что-то упускаю?
Любая помощь будет очень признательна.
источник
Ответы:
Похоже, это было исправлено в MVC4.
Вы можете сделать это, и у меня это сработало:
источник
Вы также можете использовать,
ContentResult
как предлагается здесь, вместо подклассаJsonResult
.источник
К сожалению, настройка web.config игнорируется реализацией JsonResult по умолчанию . Поэтому я предполагаю, что вам нужно будет реализовать собственный результат json, чтобы решить эту проблему.
источник
Нет необходимости в настраиваемом классе. Это все, что нужно:
где
Result
эти данные, которые вы хотите сериализовать.источник
Если для создания строки используется Json.NET,
json
устанавливатьMaxJsonLength
значение не требуется .источник
Я решил проблему, перейдя по этой ссылке
источник
Я удивлен, что никто не предложил использовать фильтр результатов. Это самый чистый способ глобально подключиться к конвейеру действие / результат:
Затем зарегистрируйте экземпляр этого класса, используя
GlobalFilters.Filters
:источник
Вы можете попробовать определить в своем выражении LINQ только то поле, которое вам понадобится.
Пример. Представьте, что у вас есть модель с идентификатором, именем, телефоном и изображением (байтовый массив), и вам необходимо загрузить ее из json в список выбора.
LINQ Query:
Проблема здесь " выберите u ", чтобы получить все поля. Итак, если у вас есть большие картинки, бумм.
Как решить? очень и очень просто.
Лучше всего выбирать только то поле, которое вы будете использовать.
Помните. Это простой совет, но он может помочь многим разработчикам ASP.NET MVC.
источник
Альтернативное исправление ASP.NET MVC 5:
В моем случае ошибка возникла во время запроса. Лучший подход в моем сценарии - это изменение фактического,
JsonValueProviderFactory
которое применяет исправление к глобальному проекту и может быть выполнено путем редактированияglobal.cs
файла как такового.добавьте запись web.config:
а затем создайте два следующих класса
По сути, это точная копия реализации по умолчанию, найденная в,
System.Web.Mvc
но с добавлением настраиваемого значения настройки приложения web.configaspnet:MaxJsonLength
.источник
Ничего из вышеперечисленного не помогло мне, пока я не изменил действие как
[HttpPost]
. и сделал тип ajax какPOST
.И вызов ajax как
источник
Было исправление для меня в MVC 4.
источник
Вам необходимо вручную прочитать раздел конфигурации, прежде чем ваш код вернет объект JsonResult. Просто прочтите файл web.config в одну строку:
Убедитесь, что вы определили элемент конфигурации в web.config
источник
это сработало для меня
источник
есть немного другой случай - данные отправляются от клиента к серверу. когда вы используете метод контроллера, и модель огромна:
система выдает исключение типа «Ошибка при сериализации или десериализации с использованием JSON JavaScriptSerializer. Длина строки превышает значение, установленное в свойстве maxJsonLength. Имя параметра: input»
В этом случае недостаточно только изменения настроек Web.config. Вы можете дополнительно переопределить сериализатор mvc json для поддержки огромных размеров модели данных или вручную десериализовать модель из Request. Ваш метод контроллера становится:
источник
Вы можете поместить этот код в cshtml, если вы возвращаете представление из контроллера и хотите увеличить длину данных пакета представления при кодировании в json в cshtml
Теперь
dataJsonOnActionGrid1
он будет доступен на странице js, и вы получите правильный результат.Спасибо
источник