2013-03-10 1 views
1

J'ai un partiel qui définit un Ajax.BeginForm. Le modèle renvoyé a une propriété pour ReportLink créée sur la ressource serveur qui renvoie une URL à une vue partielle.MVC et Ajax.BeginForm et DIV.Load

Sur l'Ajax, BeginForm.OnSuccessFunction je tente de revenir et charge le contenu html avec $("reportContent").load(AJAXRESULT.RenderLink)

Cependant, entrer dans une boucle infinie quelque part.

modifié pour ajouter des pièces en mouvement:

@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); 
    } 

Mise à jour: Je ne suis plus sûr que le navigateur est bloquer. Le contenu est de 3,15 Mo. Je pense que le html brut est très verbeux et prend autant de temps à rendre dans le navigateur. Voici la séquence d'exécution:

  1. LoadPartial (ReportModel) - Cela a un Ajax.BeginForm() qui renvoie les métadonnées de rapport et a un bouton de rafraîchissement. Lorsque le bouton d'actualisation est cliqué. J'appelle une fonction js qui charge une div en utilisant div.load (ReportModel.RenderLink), qui est une URL pour obtenir le contenu en html du contrôleur. Le ReportModel.RenderLink pointe vers une méthode de contrôleur qui renvoie un rapport html basé sur les paramètres du modèle envoyés au contrôleur. Le résultat est une vue partielle ("ReportContentPartial", chaîne) où chaîne est le fragment html. Pour tester le ReportContentPartial, il suffit de dumper @Model dans un div comme @ Html.Raw (Model) et c'est là que le navigateur se bloque. Je pensais que c'était dans une boucle infinie mais il prend juste beaucoup de temps pour rendre le html.

La partie que je ne comprends pas quand je l'utilise @ Html.BeginForm et vider le @ Html.Raw (HTML), il est assez rapide. J'ai besoin d'utiliser en quelque sorte le même mécanisme utilisé dans cette méthode de rendu. Le rapport html est récupéré et renvoyé en moins d'une seconde. Le problème est quand je trace hors de @ Html.Raw (HTML) le navigateur se verrouille et prend + 15 secondes pour rendre le contenu.

Je vais continuer à brancher. Je suis certain qu'il existe un moyen plus efficace d'y parvenir et je dois probablement réfléchir à des moyens de décomposer les rapports.

Mise à jour 2: Cela semble être un problème d'environnement de développement. Je lance IE à partir de VS2012 en utilisant la commande d'exécution. Je sens que quelque chose se passe avec le serveur de développement asp.net. Quand je charge le même URL en chrome, pendant le débogage dans vs, il rend en moins d'une seconde.

+4

s'il vous plaît partager votre méthode d'action et votre appel Form et Ajax entier. Il est très difficile de suivre un tel problème sans TOUTES les pièces –

Répondre

0

J'ai résolu ce problème. Il semble y avoir eu un problème avec les fichiers de définition de navigateur fournis avec .net 40. J'ai utilisé une version basée sur des formulaires de l'application de reporting qui utilisait des pages .aspx et des publications pour voir pourquoi le rendu serait rapide et la version MVC si lente . Lors de l'utilisation de IE 10, il ne serait pas rendu et j'ai trouvé le _dsoPostBacks ne fonctionnait pas sur la version des formulaires. J'ai ensuite trouvé Scott Hanselman's blog sur les fichiers de définition de navigateurs et appliqué le correctif sur le serveur de test et maintenant la version mvc dans IE est le rendu à un débit acceptable. Cela a quelque chose à voir avec la reconnaissance du navigateur et la rétrogradation du support de js. Je ne sais pas pourquoi cela a résolu mon problème mais il l'a fait :)

Questions connexes