好了,有趣的问题...渲染视图作为字符串
我回国的局部视图作为通过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);
而且,它的工作原理。
但是在Sergey呢?没有上下文,这没有多大意义。部分视图已经被转换为一个字符串,作为JsonResult的一部分返回。第二次对它进行序列化会在结果周围添加额外的引号,这不起作用。 –
@Chris将代码解答 - 太坏格式的评论 –
谢谢谢尔盖。您的解决方案让我走上了正确的道路。我能够使它与RenderPartialViewToString方法,序列化程序代码以及对我的JQuery回调方法的调整一起工作。 –