2011-08-31 103 views
3

我在buttonclick中使用以下javascript代码发布我的表单。jquery表单发布两次

var formIsValid = $('#createFreezerForm').valid(); 
if (formIsValid) { 
    $('#createFreezerForm').submit(); 
} 
return false; 

我用的MVC3 Ajax.Form助手创建窗体这样做。

不知何故我的表单发布了两次。有什么建议么?

这是生成的html

<div id="freezerDialog" class="ui-dialog-content ui-widget-content" style="width: auto; min-height: 64px; height: auto; "><form action="/BiobankWebsite/Storage/Freezer/Create" data-ajax="true" data-ajax-failure="errorAjaxCall" data-ajax-method="post" data-ajax-mode="replace" data-ajax-success="freezerOverview.formPostComplete" data-ajax-update="#createFreezerForm" id="createFreezerForm" method="post"> 
    <input name="__RequestVerificationToken" type="hidden" value="cu92co3Mwzt28mB3WCXGsmKYJ4RUQJxPcUUtQ4jyOcjrg82Y0QRJtGcmP818Isbd6bYqqMXj9xJOzt18TkSzFQerWNnu4F6b8pjSvvWjXNRSC3LYvisDR9+jjkG0ygtBWNSowIvdMva+Cq/9X9B9cQT2x6yOauFRen7vkmVDQMDJu9LWMZH4Z3Q6IEbonUMk"><input data-val="true" data-val-required="The FreezerId field is required." id="FreezerId" name="FreezerId" type="hidden" value="00000000-0000-0000-0000-000000000000"> 
<div class="validation-summary-valid" data-valmsg-summary="true"> 
    <span>Validation messages</span> 
    <ul><li style="display:none"></li></ul> 
</div> 
<div class="left marginRight"> 
    <div class="editor-label"> 
     <label for="FreezerType">Freezer type</label> 
    </div> 
    <div class="editor-field"> 
     <select data-val="true" data-val-required="The Freezer type field is required." id="FreezerType" name="FreezerType"> 
      <option value="">Select one...</option> 
      <option value="97cecf57-e596-4c6a-a43f-0eaed4e6a560">K10</option> 
      <option value="e7a05273-1d4d-42ad-83a4-3e19f1b48e64">K38</option> 
      <option value="304ed3e3-75c7-4437-a71b-5e26c718b684">U725</option> 
      <option value="31bc9e43-c4da-4e84-a86e-62a25b122d56">U45</option> 
      <option value="890256e8-036f-4a03-946a-fdc069b4b2e1">LBH</option> 
     </select> 
     <span class="field-validation-valid" data-valmsg-for="FreezerType" data-valmsg-replace="false">*</span> 
    </div> 
    <div class="editor-label"> 
     <label for="FreezerNameFormat">Freezer name format</label> 
    </div> 
    <div class="editor-field"> 
     <input class="medium" id="FreezerNameFormat" name="FreezerNameFormat" type="text" value=""> 
     <span class="field-validation-valid" data-valmsg-for="FreezerNameFormat" data-valmsg-replace="false">*</span> 
     <span id="freezerName" class="bold"></span> 
    </div> 
</div> 
<div class="left"> 
    <div class="editor-label"> 
     <label for="Temperature">Temperature</label> 
    </div> 
    <div class="editor-field"> 
     <input class="text-box single-line" data-val="true" data-val-number="The field Temperature must be a number." data-val-required="The Temperature field is required." id="Temperature" name="Temperature" type="text" value="0"> 
     <span class="field-validation-valid" data-valmsg-for="Temperature" data-valmsg-replace="false">*</span> 
    </div> 
    <div class="editor-label"> 
     <label for="FreezerNr">Freezer number</label> 
    </div> 
    <div class="editor-field"> 
     <input class="text-box single-line" data-val="true" data-val-number="The field Freezer number must be a number." data-val-required="The Freezer number field is required." id="FreezerNr" name="FreezerNr" type="text" value="0"> 
     <span class="field-validation-valid" data-valmsg-for="FreezerNr" data-valmsg-replace="false">*</span> 
    </div> 
</div> 
<div class="clear"> 
    <div class="editor-label"> 
     <label for="Location">Location</label> 
    </div> 
    <div class="editor-field"> 
     <input class="text-box single-line" id="Location" name="Location" type="text" value=""> 
     <span class="field-validation-valid" data-valmsg-for="Location" data-valmsg-replace="false">*</span> 
    </div> 
</div> 
<div class="clear marginTop"> 
    <button type="submit" style="display: none; "> 
     Create</button> 
</div> 
</form></div> 

这个网站是由一个jQuery get放入对话框的div。正如你所看到的,我从我的部分中删除原始的提交按钮,并添加一个新的按钮到我的对话框中。

负责这个神奇的JavaScript函数:

var showCreateDialog = function() { 
    getForm(urls.freezer.create, '#createFreezerForm'); 
    dialog.dialog({ 
     title: 'Create freezer', 
     width: 400, 
     resizable: false, 
     buttons: { 
      Create: function (event) { 
       event.preventDefault(); 
       var formIsValid = $('#createFreezerForm').valid(); 
       if (formIsValid) { 
        $('#createFreezerForm').submit(); 
       } 
       return false; 
      }, 
      Cancel: function() { 
       $(this).dialog("close"); 
      } 
     } 
    }); 
    dialog.dialog('open'); 
}; 

var getForm = function (url, formId) { 
    $.get(url, null, function (html) { 
     dialog.html(html); 
     hideAndDisableOriginalButton(formId); 
     $.validator.unobtrusive.parse("#createFreezerForm"); 
    }, 'html'); 
}; 

var formPostComplete = function (response) { 
    dialog.dialog('close'); 
    grid.trigger('reloadGrid'); 
}; 

var hideAndDisableOriginalButton = function (formId) { 
    var freezerFormCreateButton = $(formId + ' button:submit'); 
    freezerFormCreateButton.attr("disabled", "true"); 
    freezerFormCreateButton.hide(); 
}; 
+0

显示完整生成的HTML代码。 – jgauffin

+0

是那个按钮类型是'submit'? – Rafay

回答

14

我发现了这个问题。不知何故,我在该特定页面上包含了两次脚本。这就是为什么一切都被执行两次。

以下脚本,其中包括两次:

<script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script> 
<script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script> 
<script src="/Scripts/jquery.unobtrusive-ajax.min.js" type="text/javascript"></script> 
+0

这有助于。这证明了世界上所有的开发者都是如此。本地化的问题实际上并没有本地化:) – Jashwant

+0

同样的想法发生在我身上

0

你已经错过了return?例如onsubmit="return your_function();"

0

我怀疑你的原始按钮也提交表单。为防止出现这种情况,请将您的代码更改为:

 
function somethingClicked(event) { 
    event.preventDefault(); 
    var formIsValid = $('#createFreezerForm').valid(); 
    if (formIsValid) { 
     $('#createFreezerForm').submit(); 
    } 
    return false; 
} 

这里是event.preventDefault()的参考。你需要发布更多的代码,因为我们现在都处于黑暗中。

+0

添加完整的代码...我在jQuery对话框中显示了我在这个特殊情况下的部分内容。原来的部分工作,但需要在这个特定的地方对话框中显示它,这需要我执行一些自己的代码 –

0

因为jquery.unobtrusive-ajax.js还附加了一个事件到提交​​按钮,所以有两个提交发生。

您不需要将代码附加到提交按钮单击事件,因为它复制了已附加到该事件的jquery.unobtrusive-ajax.js代码。删除你的代码,它会按预期工作。