0

好了,有趣的问题...渲染视图作为字符串

我回国的局部视图作为通过this post字符串时超过MaxJsonLength。

这里是我的基本控制器是什么样子:

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 ...任何建议?

是的,我知道这里的大问题是向客户端发回太多的数据;这个问题将在未来得到解决。这是我现在需要解决的问题。谢谢。

更新 - 我的完整的解决方案

感谢谢尔盖,我得到了这个工作。如果有人想这样做,下面是步骤。

第一件事情就是去打造出来的指定here的LargeJsonResult类。

我然后利用我的基控制器类调用RenderPartialViewToString可发现here

接着是代码:

变种串行=新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){ ... $( '#报告')HTML($ parseJSON(响应) 。HTML);

而且,它的工作原理。

回答

1

这在相同的情况下工作对我来说:

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

     return serializer.Serialize(...); 

UPDATE:

首先,我使用下面的代码序列化的局部视图:

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()}); 
+0

但是在Sergey呢?没有上下文,这没有多大意义。部分视图已经被转换为一个字符串,作为JsonResult的一部分返回。第二次对它进行序列化会在结果周围添加额外的引号,这不起作用。 –

+0

@Chris将代码解答 - 太坏格式的评论 –

+0

谢谢谢尔盖。您的解决方案让我走上了正确的道路。我能够使它与RenderPartialViewToString方法,序列化程序代码以及对我的JQuery回调方法的调整一起工作。 –