Asp.net mvc 将视图呈现为字符串时超过MaxJsonLength
好吧,这么有趣的问题 我将通过字符串返回部分视图 下面是我的基本控制器的外观:Asp.net mvc 将视图呈现为字符串时超过MaxJsonLength,asp.net-mvc,json,asp.net-mvc-3,model-view-controller,serialization,Asp.net Mvc,Json,Asp.net Mvc 3,Model View Controller,Serialization,好吧,这么有趣的问题 我将通过字符串返回部分视图 下面是我的基本控制器的外观: public abstract class JsonController : Controller { protected string RenderPartialViewToString(string viewName, object model) { if (string.IsNullOrEmpty(viewName)) viewName = ControllerC
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属性上设置的值。”
我不知道该如何补救。显然,默认的JavaScriptSerializer不遵守web.config中的设置,因为很多文档都说明了这一点
但是,尝试像类这样的自定义解决方案只会导致字符串被序列化两次,这不是我需要的(而且肯定不起作用)。所以,我不知所措。当然,必须有一种方法来处理这个问题,这样我就可以将部分视图作为字符串返回,并指定maxJsonLength。。。有什么建议吗
是的,我知道这里更大的问题是向客户发回太多的数据;这一问题将在未来得到解决。这就是我现在需要解决的问题。谢谢
更新-我的完整解决方案
多亏了谢尔盖,我才把这件事做好。如果其他人想这样做,以下是步骤
第一件事是构建指定的LargeJsonResult类
然后,我使用我的基本控制器类调用RenderPartialViewToString,可以找到它
接下来是代码:
var serializer=新的JavaScriptSerializer();
serializer.MaxJsonLength=Int32.MaxValue;
var viewString=RenderPartialViewToString(“_ReportData”,viewModel)
但是仍然需要做一个调整,那就是修复JQuery回调以提取返回的html部分。回调函数最初是这样的:
函数GetReportComplete(响应、状态、xhr){
...
$('#Report').html(回复)
但它需要调整成这样:
函数GetReportComplete(响应、状态、xhr){
...
$('#Report').html($.parseJSON(response.html)
有了它,它就起作用了。在同样的情况下,这对我也起作用了:
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()});
但是Sergey在哪里?如果没有上下文,这没有多大意义。部分视图已经被转换为字符串,作为JsonResult的一部分返回。再次序列化它会在结果周围加上引号,这不起作用。@Chris会回答代码-Sergey中的格式太糟糕了。您的解决方案g我可以使用RenderPartialViewToString方法、序列化程序代码和对JQuery回调方法的调整使其正常工作。
...
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()});