2011-08-29 147 views
3

this question禁用提交按鈕以防止多次回發是停止(非惡意)用戶多次回發的可行解決方案。在MVC中防止多次提交

如果您有多個提交按鈕的視圖,則此選項無法正常工作。以下面的例子。

//查看:

@using (Html.BeginForm("Catalog", "Images", FormMethod.Post, new { onsubmit = "Utility.disable_buttons(this.id);", id = "catalog_form" })) 
{ 
<p> 
    <input type="submit" name="btnSubmit" value="Clear" /> | 
    <input type="submit" name="btnSubmit" value="Catalog" /> | 
    <input type="submit" name="btnSubmit" value="Update" /> | 
    @Html.ActionLink("Back to List", "Index") 
</p> 
} 

//控制器:

[HttpPost] 
    public ActionResult Catalog(string btnSubmit) 
    { 
     switch (btnSubmit) 
     { 
      case "Catalog": 
       //More differenter code 
       break; 
      case "Clear": 
       //Different code 
       break; 
      case "Nothing": 
       //Code 
       break; 
     } 
     return View(); 
    } 

在視圖中,有三種不同的提交動作。如果這些按鈕被禁用,那麼它們的值將不會被傳遞,並且控制器將不知道哪個按鈕觸發了提交。 (控制器始終爲空。)不幸的是,submitdisabledcontrols屬性似乎不能解決MVC中的這個問題。有人知道如何將禁用控件的值傳遞給服務器嗎?

+0

我可能不得不爲這個看似簡單的問題開始賞金...... – Coda

回答

2

一些背景資料:

如果你想禁用所有的按鈕,使他們不再是可點擊的,但仍然想知道用戶點擊我能想到的唯一的解決辦法是隱藏字段一起使用此代碼:

$(function() { 
    $('input[type=submit]').click(function() { 
     var form = $(this).closest('form'); 
     form.find('#hiddenField').val($(this).val()); 
     form.find('input[type=submit]').prop('disabled', true); 
    }); 
}); 

如果你只是要確保用戶不能點擊其他按鈕點擊後,一個你可以這樣做:

$(function() { 
    $('input[type=submit]').click(function(event) { 
     $(this).closest('form').find('input[type=submit]').not(this).prop('disabled', true); 
    }); 
}); 

不幸的是沒有解決辦法(我知道)綁定一個處理器到form's提交併確定輸入被點擊。這不是與你的問題有關的問題,但使上述代碼稍微複雜一些。

+0

I最終得出同樣的結論。看起來有許多方法可以將禁用控件提交回服務器(submitdisabledcontrols =「true」),但我永遠無法使其運行。我最終只做了服務器端更改以處理多個按鈕點擊。 – Coda

0

你可以試試這個

if (coll.AllKeys.Contains("Clear")) 
{ 
    // your code here for this submit 
} 
+0

這根本不起作用。 Request.ServerVariables(我假設你在談論)不包含該字段的鍵。它不會傳回服務器,因爲它被禁用。這可以通過在表單上放置submitdisabledcontrols =「true」屬性來解決ASP.net中的webforms。 MVC3顯然不同。 – Coda

+0

我正在談論FormCollectionCollection變量,它可以作爲參數傳遞,而一個動作被調用時,這個集合擁有所有提交按鈕的所有鍵名,在上面的例子中它是「清除」按鈕提交 –