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は非常に冗長で、ブラウザでのレンダリングに時間がかかると思います。実行シーケンスは次のとおりです。
LoadPartial(ReportModel) - レポートのメタデータを返す Ajax.BeginForm() があり、更新ボタンがあります。更新ボタンがクリックされたとき。div.load(ReportModel.RenderLink) を使用して div をロードする js 関数を呼び出します。これは、コントローラーからコンテンツを html として取得するための URL です。
ReportModel.RenderLink は、コントローラに送信されたモデル パラメータに基づいて HTML レポートを返すコントローラ メソッドを指します。結果は PartialView("ReportContentPartial",string) で、string は html フラグメントです。
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秒もかからずにレンダリングされます。