1

Ajax.BeginForm を定義するパーシャルがあります。返されるモデルには、サーバー リソースで作成された ReportLink のプロパティがあり、URL を PartialView に返します。

Ajax,BeginForm.OnSuccessFunction で、HTML コンテンツを返してロードしようとしています$("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は非常に冗長で、ブラウザでのレンダリングに時間がかかると思います。実行シーケンスは次のとおりです。

  1. LoadPartial(ReportModel) - レポートのメタデータを返す Ajax.BeginForm() があり、更新ボタンがあります。更新ボタンがクリックされたとき。div.load(ReportModel.RenderLink) を使用して div をロードする js 関数を呼び出します。これは、コントローラーからコンテンツを 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 が取得され、1 秒以内に返されます。問題は、@Html.Raw(HTML) をトレースすると、ブラウザーがロックされ、コンテンツのレンダリングに +15 秒かかることです。

私はそれをプラグインし続けます。もっと効率的な方法があると確信しており、おそらくレポートを分割する方法を考える必要があります。

更新 2:これは開発環境の問題のようです。run コマンドを使用して VS2012 から IE を起動しています。asp.net 開発サーバーで何かが起きているように感じます。vsでデバッグ中に同じURLをクロムにロードすると、1秒もかからずにレンダリングされます。

4

1 に答える 1

0

私はこれを解決しました。.net 40 に同梱されているブラウザー定義ファイルに問題があったようです。.aspx ページとポストバックを使用するレポート アプリケーションのフォーム ベース バージョンに戻って、レンダリングが速く、MVC バージョンが非常に遅い理由を確認しました。 . IE 10 を使用するとレンダリングされず、フォーム バージョンで _dsoPostBacks が機能していないことがわかりました。その後、ブラウザー定義ファイルに関するScott Hanselman のブログを見つけ、テスト サーバーに修正プログラムを適用したところ、ie の mvc バージョンが許容可能な速度でレンダリングされました。これは、ブラウザーの認識と js サポートのダウングレードに関係しています。それが私の問題を解決した理由はわかりませんが、解決しました:)

于 2013-03-11T17:34:06.780 に答える