2012-04-04 18 views
11

Ok soy un completo novato web, pero debo admitir que estoy totalmente enganchado ahora. Aquí está mi problema:JQuery y Ajax.BeginForm() publicando los mismos datos dos veces

Tengo una página con una grilla MVCContrib y un enlace "Agregar cuentas" que muestra un formulario Ajax envuelto en un cuadro de diálogo de JQuery. Cuando reviso el flujo de trabajo la primera vez, todo funciona bien. Puedo agregar un nuevo elemento y actualizar la grilla a través de JQuery/Ajax (eso creo). Sin embargo, cuando intento agregar el formulario por segunda vez, los datos del primer formulario siempre se envían. He estado mirando el problema demasiado tiempo y debo admitir que estoy totalmente atascado. Por cierto, estoy seguro de que estoy haciendo esto totalmente mal, así que siéntete libre de sugerir algo mejor.

Aquí es la forma:

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

Esta Javascript reside en bank.js presentar

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

El inicialmente para que se rindió haciendo clic en el enlace añadir en este punto de vista:

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

Respuesta

35

He tenido el mismo problema y golpeé mi cabeza contra una pared hasta que noté que el siguiente guión estaba incluido uded dos veces:

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

lo tenía guión establecido dentro de mi paquete y las plantillas de vista también incluyó lo que resultó en el post de doble por la forma ajax.

creo que sirve, si no duplicar la recompensa :-P

+0

Sinceramente, esperaba que esto era mi problema (como en el depurador puedo ver dos de cada archivo por alguna reaso), pero no lo es. – Worthy7

+0

¡Gracias por salvarme el día! –

+1

Esta respuesta debe marcarse como correcta. – AlphaTry

Cuestiones relacionadas