【问题标题】:MVC And Ajax.BeginForm and DIV.LoadMVC 和 Ajax.BeginForm 和 DIV.Load
【发布时间】:2013-03-10 03:53:18
【问题描述】:

我有一个定义 Ajax.BeginForm 的部分。返回的模型具有在服务器资源上创建的 ReportLink 属性,该属性将 Url 返回到 PartialView。

在 Ajax 上,BeginForm.OnSuccessFunction 我正在尝试使用 $("reportContent").load(AJAXRESULT.RenderLink) 返回和加载 html 内容

但是,我在某处陷入了无限循环。

编辑添加移动部件:

@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 非常冗长,并且需要很长时间才能在浏览器中呈现。以下是执行顺序:

  1. LoadPartial(ReportModel) - 这有一个 Ajax.BeginForm(),它返回报告元数据并有一个刷新按钮。单击刷新按钮时。我调用了一个js函数,它使用div.load(ReportModel.RenderLink)加载了一个div,这是一个从控制器获取内容为html的url。

  2. ReportModel.RenderLink 指向一个控制器方法,该方法根据发送到控制器的模型参数返回一个 html 报告。结果是 PartialView("ReportContentPartial",string) ,其中 string 是 html 片段。

  3. 为了测试 ReportContentPartial,只需将 @Model 作为 @Html.Raw(Model) 转储到一个 div 中,这就是浏览器锁定的地方。我以为它处于无限循环中,但渲染 html 需要很长时间。

我不明白的部分是当我使用 @Html.BeginForm 并转储 @Html.Raw(HTML) 时,它非常快。我需要以某种方式使用该渲染方法中使用的相同机制。报告 html 在不到一秒的时间内被提取并返回。问题是当我追踪到 @Html.Raw(HTML) 时,浏览器会锁定并需要 +15 秒才能呈现内容。

我会继续努力的。我确信有一种更有效的方法可以解决这个问题,我可能需要考虑拆分报告的方法。

更新 2: 这似乎是开发环境问题。我正在使用运行命令从 VS2012 启动 IE。我感觉 asp.net 开发服务器出了点问题。当我在 chrome 中加载相同的 url 时,在 vs 中调试时,它会在不到一秒的时间内呈现。

【问题讨论】:

  • 请分享您的操作方法以及您的整个表单和 Ajax 调用。如果没有所有部分,很难解决这样一个涉及的问题

标签: c# jquery ajax asp.net-mvc asp.net-mvc-4


【解决方案1】:

我解决了这个问题。 .net 40 附带的浏览器定义文件似乎存在问题。我求助于使用 .aspx 页面和回发的基于表单的报告应用程序版本,以了解为什么它会快速呈现而 MVC 版本如此缓慢.使用 IE 10 时,它不会呈现,我发现 _dsoPostBacks 不适用于表单版本。然后我在浏览器定义文件中找到Scott Hanselman's blog 并在测试服务器上应用了修补程序,现在 ie 中的 mvc 版本正在以可接受的速率呈现。它与识别浏览器和降级 js 支持有关。我不知道为什么这解决了我的问题,但确实解决了:)

【讨论】:

    猜你喜欢
    • 2014-02-14
    • 2012-09-12
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    相关资源
    最近更新 更多