我有一个定义Ajax.BeginForm的部分。返回的模型具有在服务器资源上创建的ReportLink属性,该属性将Url返回到PartialView。
在Ajax上,BeginForm.OnSuccessFunction我试图用$("reportContent").load(AJAXRESULT.RenderLink)
然而,我在某个地方陷入无限循环。
编辑添加移动部件:
@model xxxx.Reports.Models.Reports.BaseReportModel
@{Layout = null;}
<div id="reportBase" class="k-content">
<div id="reportControl" >
@using (Ajax.BeginForm(
Model.PostAction,
Model.PostController,
null,
new AjaxOptions() { OnSuccess = "editPostSuccess", OnFailure = "editPostFailure" },
new { id = "reportBase_frmViewer", name = "reportBase_frmViewer" }))
{
@Html.AntiForgeryToken()
@RenderSection("reportParams", required: false)
if (@Model.AllowRefresh){
<input type="button" id="btnRefresh" value="refresh" />
}
if (@Model.AllowExportToPDF){
<input type="button" id="btnPDF" value="PDF" />
}
if (@Model.AllowExportToExcel){
<input type="button" id="btnExcel" value="XLS" />
}
@Html.HiddenFor(p => p.AllowExportToExcel)
@Html.HiddenFor(p => p.AllowExportToPDF)
@Html.HiddenFor(p => p.AllowRefresh)
@Html.HiddenFor(p => p.AutoStartReport)
}
</div>
</div>
<div id="wait"></div>
<div id="reportContent"></div>
//The
<script type="text/javascript">
function editPostSuccess(ajaxContext) {
showWaitIndicator(false);
$('#reportContent').load(ajaxContext.RenderLink**,<--This is a link to an asction that calls renderPartial on the controller** function () {
$("#reportContent").show();
});
}
function editPostFailure(ajaxContext) {
showWaitIndicator(false);
var response = JSON.parse(ajaxContext.responseText);
var errorMessage = response.Message;
$('#reportContent').html('@Resources.labels.lblServerErrorsOnForm' + " " + errorMessage);
$("#reportContent").show();
alert("FAILURE:"+response.Message);
}
更新:我不再确定浏览器是否已锁定。内容为3.15 MB。我认为原始html非常冗长,需要很长时间才能在浏览器中呈现。这是执行顺序:
LoadPartial(ReportModel) - 它有一个Ajax.BeginForm(),它返回报告元数据并有一个刷新按钮。单击刷新按钮时。我调用了一个使用div.load(ReportModel.RenderLink)加载div的js函数,这是一个从控制器获取内容为html的URL。
ReportModel.RenderLink指向一个控制器方法,该方法根据发送到控制器的模型参数返回html报告。结果是PartialView(&#34; ReportContentPartial&#34;,string),其中string是html片段。
为了测试ReportContentPartial,只需将@Model转储到div中,作为@ Html.Raw(Model),这就是浏览器锁定的地方。我认为它是在一个无限循环中,但它只是让位于长时间来呈现html。
我不明白的部分是当我使用@ Html.BeginForm并转储@ Html.Raw(HTML)时,它非常快。我需要以某种方式使用该渲染方法中使用的相同机制。提取报告html并在不到一秒的时间内返回。问题是当我跟踪@ Html.Raw(HTML)浏览器锁定并花费+15秒来呈现内容时。
我会继续插手。我确信有一种更有效的方法,我可能需要考虑如何分解报告。
更新2:这似乎是开发环境问题。我正在使用run命令从VS2012启动IE。我觉得asp.net开发服务器出了点问题。当我在chrome中加载相同的url时,在vs中进行调试时,它会在不到一秒的时间内呈现。
答案 0 :(得分:0)
我解决了这个问题。似乎与.net 40附带的浏览器定义文件存在问题。我使用了.aspx页面和回发的报表应用程序的基于表单的版本,以查看为什么它会快速呈现并且MVC版本如此之慢。使用IE 10时它不会渲染,我发现_dsoPostBacks没有在表单版本上工作。然后我在浏览器定义文件上找到了Scott Hanselman's blog,并在测试服务器上应用了此修补程序,现在mvc版本在ie中以可接受的速率呈现。它与识别浏览器和降级js支持有关。我不知道为什么解决了我的问题,但确实如此:)