Превышение MaxJsonLength при рендеринге представления в виде строки - PullRequest
0 голосов
/ 05 октября 2011

Хорошо, такая интересная проблема ...

Я возвращаю частичное представление в виде строки через в этом сообщении .

Вот как выглядит мой базовый контроллер:

public abstract class JsonController : Controller
  {
    protected string RenderPartialViewToString(string viewName, object model)
    {
      if (string.IsNullOrEmpty(viewName))
        viewName = ControllerContext.RouteData.GetRequiredString("action");

      ViewData.Model = model;

      using (var sw = new StringWriter())
      {
        var viewEngineResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
        var viewContext = new ViewContext(ControllerContext, viewEngineResult.View, ViewData, TempData, sw);
        viewEngineResult.View.Render(viewContext, sw);

        return sw.GetStringBuilder().ToString();
      }
    }
  }

И вот как он используется:

ret = Json(RenderPartialViewToString("_ReportData", viewModel));

Однако, теперь результат этого представления слишком велик иЯ получаю страшную ошибку:

«Длина строки превышает значение, установленное в свойстве maxJsonLength».

Я не уверен, как это исправить.Очевидно, что параметр в файле web.config НЕ подчиняется стандартному JavaScriptSerializer, так как во многих документах об этом говорится.

Тем не менее, попытка пользовательских решений, таких как класс LargeJsonResult , просто приводит к сериализации строки дважды , что мне не нужно (и определенно не работает),Итак, я в растерянности.Конечно, должен быть способ справиться с этим, чтобы я мог вернуть частичное представление в виде строки, а также указать maxJsonLength ... Есть предложения?

И да, я знаю, что большая проблема здесь заключается в отправке слишком большого количества данных клиенту;эта проблема будет решена в будущем.Это проблема, которую мне нужно решить сейчас.Благодарю.

ОБНОВЛЕНИЕ - МОЕ ПОЛНОЕ РЕШЕНИЕ

Спасибо Сергею, у меня все получилось.В случае, если кто-то еще хочет сделать это таким образом, вот шаги.

Первым делом нужно создать класс LargeJsonResult, указанный здесь .

Затем я использовал свой базовый класс контроллера для вызова RenderPartialViewToString, который можно найти здесь .

Следующий код:

var serializer = new JavaScriptSerializer ();serializer.MaxJsonLength = Int32.MaxValue;var viewString = RenderPartialViewToString ("_ ReportData", viewModel);

  ret = new LargeJsonResult()
          {
            Data = new
                     {
                       result = "Success",
                       html = viewString
                     }
          };

Но была еще одна настройка, которая исправляла обратный вызов JQuery для извлечения html-части возврата.Функция обратного вызова изначально выглядела так:

функция GetReportComplete (response, status, xhr) {... $ ('# Report'). Html (response);

Но для этого нужно былонастроить так:

функция GetReportComplete (ответ, статус, xhr) {... $ ('# Report'). html ($. parseJSON (response) .html);

И с этим все работает.

1 Ответ

1 голос
/ 05 октября 2011

Это сработало для меня в той же ситуации:

        var serializer = new JavaScriptSerializer();
        serializer.MaxJsonLength = Int32.MaxValue;

        return serializer.Serialize(...);

ОБНОВЛЕНИЕ:

Сначала я использую следующий код для сериализации частичного представления:

    protected static String SerializeControl(string controlPath, object model)
    {
        var page = new ViewPage();
        var ctl = (ViewUserControl)page.LoadControl(controlPath);
        page.Controls.Add(ctl);
        page.ViewData.Model = model;
        page.ViewContext = new ViewContext();
        var writer = new StringWriter();
        System.Web.HttpContext.Current.Server.Execute(page, writer, false);
        var outputToReturn = writer.ToString();
        writer.Close();
        return outputToReturn.Trim();
    }

Затем я использую код, который я написал изначально, чтобы добавить эту строку в JSON:

...
    var htmlsb = new StringBuilder();
...
    // listObj initialization here, doesn't matter for question
...
    htmlsb.Append(SerializeControl("~/Views/Shared/ListItem.ascx", listObj));

    var serializer = new JavaScriptSerializer();
    serializer.MaxJsonLength = Int32.MaxValue;

    return serializer.Serialize(new {result = "Success", html = htmlsb.ToString()});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...