好的,这么有趣的问题......
我通过this post将部分视图作为字符串返回。
这是我的基本控制器的样子:
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中的设置,因为很多文档都说明了这一点。
然而,尝试像LargeJsonResult类这样的自定义解决方案只会导致字符串序列化两次,这不是我需要的(并且肯定不起作用)。所以,我很茫然。当然必须有一种方法来处理这个,所以我可以将部分视图作为字符串返回,并指定maxJsonLength ...任何建议?
是的,我知道这里更大的问题是向客户发回太多数据;该问题将在未来得到解决。这是我现在需要解决的问题。谢谢。
更新 - 我的完整解决方案
谢谢谢尔盖,我得到了这个工作。如果其他人想要这样做,这是步骤。首先要构建指定here的LargeJsonResult类。
然后我利用我的基本控制器类来调用RenderPartialViewToString,它可以找到here。
接下来是代码:
var serializer = new JavaScriptSerializer(); serializer.MaxJsonLength = Int32.MaxValue; var viewString = RenderPartialViewToString(“_ ReportData”,viewModel);
ret = new LargeJsonResult()
{
Data = new
{
result = "Success",
html = viewString
}
};
但仍有一个调整要做,那就是修复JQuery回调以获取返回的html部分。回调函数最初看起来像这样:
function GetReportComplete(response,status,xhr){ ... $( '#报告')HTML(响应);
但它需要调整为这样:
function GetReportComplete(response,status,xhr){ ... $( '#报告')的HTML($ parseJSON(响应)。html的。);
有了它,它有效。
答案 0 :(得分:1)
在同样的情况下,这对我有用:
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()});