2012-04-04 5 views
11

Ok Je suis un débutant web, mais je dois admettre que je suis totalement accro maintenant. Voici mon problème:JQuery et Ajax.BeginForm() affichant les mêmes données deux fois

J'ai une page avec une grille MVCContrib et un lien "Ajouter des comptes" qui fait apparaître un formulaire Ajax enveloppé dans une boîte de dialogue JQuery. Quand je passe par le flux de travail la première fois tout fonctionne très bien. Je peux ajouter un nouvel élément et rafraîchir la grille via JQuery/Ajax (donc je pense). Toutefois, lorsque j'essaie d'ajouter le formulaire une deuxième fois, les données du premier formulaire sont toujours soumises. Je regarde le problème depuis trop longtemps et dois admettre que je suis totalement coincé. Btw - Je suis sûr que je fais tout à fait faux alors n'hésitez pas à suggérer quelque chose de mieux.

est ici la forme:

@using (Ajax.BeginForm("SaveCheckAccount", "UserManagement", null, new AjaxOptions { OnSuccess = "onAccountAdded", OnFailure = "onAccountAddedFailed"}, new { id = "accountDetails" })) 
{ 
    @Html.ValidationSummary(true) 
    @Html.HiddenFor(model => model.Id) 
    @Html.HiddenFor(model => model.version) 
    @Html.HiddenFor(model => model.User_Id) 
    @Html.HiddenFor(model => model.IsDefault)   
    <table> 
     <tr> 
      <td> 
       Account Number 
      </td> 
      <td> 
       @Html.TextBoxFor(model => model.AccountNumber) 
       @Html.ValidationMessageFor(model => model.AccountNumber, "*") 
      </td> 
     </tr> 
     <tr> 
      <td> 
       Routing Number 
      </td> 
      <td> 
       @Html.TextBoxFor(model => model.RoutingNumber) 
       @Html.ValidationMessageFor(model => model.RoutingNumber, "*") 
      </td> 
     </tr> 
     <tr> 
      <td> 
       Account Type 
      </td> 
      <td> 
       @Html.DropDownListFor(model => model.AccountType_Id, new SelectList(@accountTypes, "ID", "Name", Model.AccountType_Id)) 
       @Html.ValidationMessageFor(model => model.CheckAccountType) 
       @Html.ValidationMessageFor(model => model.AccountType_Id, "*") 
      </td> 
     </tr> 
     <tr> 
      <td> 
       Bank Name 
      </td> 
      <td> 
       @Html.TextBoxFor(model => model.BankName) 
       @Html.ValidationMessageFor(model => model.BankName, "*") 
      </td> 
     </tr> 
     <tr> 
      <td> 
       Account Name 
      </td> 
      <td> 
       @Html.TextBoxFor(model => model.AccountName) 
       @Html.ValidationMessageFor(model => model.AccountName, "*") 
      </td> 
     </tr> 
    </table> 
} 

<script type="text/javascript"> 
    $.ajaxSetup({ cache: false }); 
</script> 

Ce javascript réside dans bank.js fichier

function BindCommands(createUrl) { 

     $("#modalAdd").live("click", function (e) { 
      var dialogBox = $("<div>"); 
      e.preventDefault(); 
      $(dialogBox).dialog({ 
       autoOpen: false, 
       resizable: false, 
       title: 'Create Account', 
       modal: true, 
       show: { effect: "blind", duration: 50 }, 
       hide: { effect: "blind", duration: 50 }, 
       open: function (event, ui) { 
        $.ajax(
         { 
          type: "Get",       
          url: createUrl, 
          success: function (result) { 
           $(dialogBox).html(result); 
          } 
         }); 
       }, 

       buttons: { 
        Save: function() { 
         $("#accountDetails").submit(); 
         $(this).dialog('close');      
        }, 
        Cancel: function() { 
         $(this).dialog("close"); 
        } 
       } 
      }); 
      $(dialogBox).dialog('open'); 
     }); 
    } 

    function onAccountAdded(data, status, xhr) {  
     $("#accounts-grid").html(data); 
    }; 

    function onAccountAddedFailed(data, status, xhr) { 
     alert("Failed");  
    }; 

Le pour est intially rendu en cliquant sur le lien ajouter sur ce point de vue:

<script type="text/javascript"> 
    $.ajaxSetup({cache:false}); 
    $(document).ready(function() { 
     var createUrl = '@Url.Action("NewBankAccountDetails", "UserManagement", new {[email protected]})'; 
     BindCommands(createUrl); 
    }); 

</script>  
@if (Model != null && Model.Id > 0) 
{ 

    <tr> 
     <td class="header" colspan="2"> 
      User Accounts 
     </td> 
    </tr> 
    <tr> 
     <td> 
      <a href="#" id="modalAdd">Add Account</a> 
     </td> 
    </tr> 

    Html.RenderPartial("_BankAccountGrid", Model.CheckAccounts); 
} 

Répondre

35

J'ai eu le même problème et je me suis cogné la tête contre un mur jusqu'à ce que je remarque que le script suivant est incl. uded deux fois:

<script src="/Scripts/jquery.unobtrusive-ajax.js"></script> 

je l'avais manuscrit placé à l'intérieur de mon paquet et la vue des modèles également inclus ce qui a donné lieu à double poste de par la forme ajax.

Hope it helps, sinon doubler la prime :-P

+0

J'espérais sincèrement que c'était mon problème (comme dans le débogueur je peux voir deux de chaque fichier pour certains reaso) mais son pas. – Worthy7

+0

Merci d'avoir sauvé ma journée! –

+1

Cette réponse doit être marquée comme correcte. – AlphaTry

Questions connexes