2012-04-04 14 views
11

OK Jestem początkującym użytkownikiem sieci, ale muszę przyznać, że jestem teraz całkowicie uzależniony. Oto mój problem:JQuery i Ajax.BeginForm() wysyłanie tych samych danych dwa razy

Mam stronę z siatką MVCContrib i linkiem "Dodaj konta", który wyświetla formularz Ajax zawinięty w oknie dialogowym JQuery. Kiedy po raz pierwszy przejdę przez obieg pracy, wszystko działa świetnie. Mogę dodać nowy element i odświeżyć siatkę za pośrednictwem JQuery/Ajax (tak myślę). Jednak, gdy próbuję dodać formularz po raz drugi, dane z pierwszego formularza są zawsze przesyłane. Zbyt długo przyglądałem się problemowi i muszę przyznać, że całkowicie utknąłem. Przy okazji - jestem pewien, że robię to całkowicie źle, więc sugeruj coś lepszego.

Oto forma: rezyduje

@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> 

Ten javascript w bank.js złożyć

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

FOR jest intially renderowane klikając link dodaj na tym widoku:

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

Odpowiedz

35

Miałem ten sam problem i uderzyłem głową o ścianę, dopóki nie zauważyłem następującego skryptu uded dwukrotnie:

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

miałem to skrypt ustawiony wewnątrz mojego pakietu i zobacz szablony zawarte to co zaowocowało podwójnym wpisu za pomocą formularza ajax również.

Nadzieję, że pomoże, jeśli nie podwoić nagrodę :-P

+0

Szczerze nadzieję to był mój problem (jak w debugera widzę dwa z każdego pliku z jakiegoś reaso), ale jej nie. – Worthy7

+0

Thx za uratowanie mojego dnia! –

+1

Ta odpowiedź musi być oznaczona jako poprawna. – AlphaTry

Powiązane problemy