2010-05-21 40 views
8

Tôi có một ứng dụng asp.net mà tôi muốn vô hiệu hóa các nút ngay khi chúng được nhấp để ngăn chặn nhiều lần gửi. Tôi muốn sử dụng jquery cho điều này vì trang web đã được tự do sử dụng nó anyway.Vô hiệu hóa các nút trên bài đăng trở lại bằng cách sử dụng jquery trong ứng dụng .net

Những gì tôi đã cố gắng là:

$(document).ready(function() { 
    $("#aspnetForm").submit(function() { 
     $('input[type=submit]', $(this)).attr("disabled", "disabled"); 
    }) 
}); 

trên sẽ vô hiệu hóa các nút, và trang nộp, nhưng nút asp.net trên handler nhấp chuột không bao giờ được gọi. Chỉ cần xóa các nút ở trên và các nút hoạt động như bình thường.

Có cách nào tốt hơn không? Hay đúng hơn, tôi đang làm gì sai?

CẬP NHẬT Được rồi, cuối cùng tôi đã có một chút thời gian để đặt một trang rất đơn giản với nhau.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SubTest.aspx.cs" Inherits="MyTesting.SubTest" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
     $(function() { 
      $("#form1").submit(function() { 
       $('input[type=submit]', $(this)).attr("disabled", "disabled"); 
      }); 
     }); 
    </script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" /> 
     <asp:Button ID="Button2" runat="server" onclick="Button2_Click" Text="Button 2" /> 
    </div> 
    </form> 
</body> 
</html> 

Các mã sau trông giống như:

using System; 

namespace MyTesting { 
    public partial class SubTest : System.Web.UI.Page { 
    protected void Page_Load(object sender, EventArgs e) { 
     if (IsPostBack) { 
      // this will execute when any button is pressed 
      Response.Write("postback"); 
     } 
    } 
     protected void Button1_Click(object sender, EventArgs e) { 
     // never executes 
      System.Threading.Thread.Sleep(1000); 
      Response.Write("Button 1 clicked<br />"); 
     } // method::Button1_Click 

     protected void Button2_Click(object sender, EventArgs e) { 
     // never executes 
      System.Threading.Thread.Sleep(1000); 
      Response.Write("Button 2 clicked<br />"); 
     } // method::Button2_Click 
    } 
} 

Khi bạn bấm vào một nút nó rõ ràng là vô hiệu hóa các nút, nhưng không ai trong số các nhấp chuột vào nút đang chạy.

HTML rendered

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title> 

</title> 
    <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
     $(function() { 
      $("#form1").submit(function() { 
       $('input[type=submit]', $(this)).attr("disabled", "disabled"); 
      }); 
     }); 
    </script> 
</head> 
<body> 
    <form name="form1" method="post" action="SubTest.aspx" id="form1"> 
<div> 
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTcxODU4OTc0MWRkParC5rVFUblFs8AkhNMEtFAWlU4=" /> 
</div> 

<div> 

    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwKB57WhCAKM54rGBgK7q7GGCC6LlWKFoij9FIBVuI0HOVju/fTy" /> 
</div> 
    <div> 
     <input type="submit" name="Button1" value="Button" id="Button1" /> 
     <input type="submit" name="Button2" value="Button 2" id="Button2" /> 
    </div> 
    </form> 
</body> 
</html> 
+0

Rất thú vị gotchya –

+0

Tôi nghĩ rằng tôi biết chính xác những gì đang xảy ra bây giờ. Bởi vì các thuộc tính nút bị vô hiệu hóa được thiết lập, các động cơ asp.net nói "oh, nút bị vô hiệu hóa, không chạy nó đăng lại mã!" Tuy nhiên, vì gửi được gửi đi, nó tiếp tục và thực hiện một bài đăng thường xuyên trở lại ... grr – NotMe

Trả lời

1

Tôi chỉ muốn t o thêm độ phân giải bổ sung. Chúng tôi đã quyết định loại bỏ hoàn toàn nút khi nó được nhấp và thay thế bằng một số văn bản.

Để thực hiện điều này, chúng tôi đã làm:

$(function() { 
    $(".DisableButton").click(function() { 
     $(this).hide(); 
     $(this).after('<p>Please Wait. Retrieving information. This may take up to 60 seconds.</p>'); 

    }); 
}); 

Lưu ý rằng điều này ẩn nút sau đó tiêm một số html sau khi mã nút. Ẩn nó cho phép. Net để đi trước và chạy trình xử lý onclick trong khi đăng lại trong khi loại bỏ nó như là một điều có thể click trên màn hình.

+0

Cảm ơn, đây là câu trả lời đơn giản nhất mà tôi từng thấy. –

7

Bạn có thể làm điều đó một cách hơi khác nhau, như thế này:

$(function() { 
    $("#aspnetForm").submit(function() { 
    $('input[type=submit]').click(function() { return false; }); 
    }); 
}); 

Điều này không là làm cho nhấp chuột trong tương lai không hiệu quả, về cơ bản khiến họ không làm gì cả. Khi bạn tắt một đầu vào, nó cũng loại bỏ cặp khóa/giá trị khỏi được gửi với <form>, do đó hành động phía máy chủ được kích hoạt bởi nó không hoạt động.

Nó đáng chú ý, trong jQuery 1.4.3 bạn sẽ có thể để rút ngắn này xuống:

$(function() { 
    $("#aspnetForm").submit(function() { 
    $('input[type=submit]').click(false); 
    }); 
}); 
+0

Tôi đang chạy 1.4.2 ngay bây giờ. cái đầu tiên dường như không ngừng nhấn nhiều nút; – NotMe

+0

@Chris - Bạn có thể đăng đánh dấu của mình không? Bạn có đang sử dụng các nút gửi hoặc có thể là các liên kết không? –

+0

@Nick Craver: Cuối cùng cũng có cơ hội đăng một số đánh dấu – NotMe

0

Nếu bạn có điều khiển xác nhận ASP.NET trên trang của bạn của nó trở nên phức tạp. Nhưng điều này đã được trả lời trước: Disable button on form submission

+0

Tôi đã thử điều đó. Tôi gặp lỗi biên dịch: tên 'ClientScript' không tồn tại trong ngữ cảnh hiện tại. Nếu tôi đưa ra dòng tham chiếu 'ClientScript' thì nút bị vô hiệu hóa, nhưng nó không bao giờ đệ trình – NotMe

+0

Bạn đang thử điều này trong một điều khiển thay vì trang? Nếu vậy, bạn cần phải tham chiếu thuộc tính ClientScript trên trang, ví dụ: 'Page.ClientScript.GetPostBackEventReference (btnSubmit, string.Empty)'. – jrummell

+0

Nó nằm trong một trang và không có xác thực. Chỉ cần cập nhật câu trả lời của tôi với đánh dấu. – NotMe

2

Phương pháp vô hiệu hóa các nút trước khi nộp có hai tác dụng: -

a) Nút mất trên sự xuất hiện tàn tật.

b) Giá trị của nút không được đăng trong thông số biểu mẫu.

Nếu giá trị của nút không được đăng lên máy chủ, ASP.Net không biết nút nào được nhấn và do đó nó không chạy trình xử lý OnClick thích hợp.

Để xác minh thêm dòng sau vào code của bạn đằng sau

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Write("Load " + IsPostBack + "<br />"); 
    foreach (string s in Request.Form.AllKeys) 
    { 
     Response.Write(string.Format("s:'{0}' = {1}<br />", s, Request.Form[s])); 
    } 
} 

Và sau đó chạy trang (cả với J.S. để vô hiệu hóa các nút và không có). Nếu giá trị của nút không được đăng lên máy chủ, ASP.Net không biết nút nào được nhấn và do đó nó không chạy trình xử lý OnClick thích hợp.

+0

+1 Đây là kết quả chính xác của tôi. Như bạn đã nói, đó là một gotchya thú vị. – NotMe

2

Chỉ cần một quan sát khác. Ngoài ra, bạn có thể khóa giao diện người dùng với một tin nhắn bận rộn lớp phủ đẹp.

The Mark-up phần:

$(function() { // when document has loaded 

    ($.unblockUI); //unlock UI 

    //Show busy message on click event and disable UI 
    $('#btnHelloWorld').click(function() { 
    $.blockUI({ message: '<h4><img src="busy.gif" />Please wait...</h4>' }); 

    }); 

}); 

<asp:Button ID="btnHelloWorld" runat="server" Text="Hello World" /><br/> 

Bộ luật sau:

Protected Sub btnHelloWorld_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnHelloWorld.Click 
     Label1.Text = "Hello World" 
     Threading.Thread.Sleep(5000) 
    End Sub 

Check-out jQuery BlockUI Plugin

+0

Cách tiếp cận thú vị. Tôi sẽ phải thử cái này. – NotMe

0

Thêm thuộc tính này để nút của bạn:

usesubmitbehavior="False" 

này sẽ chèn giống như sau vào onclick:

javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$Main$Tabs$SaveTab$Cancel", "", true, "", "", false, false)) 

Mã này sẽ gây ra một bài trở lại ngay cả khi nút bị vô hiệu hóa. Hiển thị một hộp thoại xác nhận và cho phép các bài lại bị hủy bỏ được một chút thú vị hơn:

var click = $("[id$='_Cancel']")[0].onclick; 
    $("[id$='_Cancel']")[0].onclick = null; 
    $("[id$='_Cancel']").bind('click', function (event) { addFeeSchedule.onCancelClick(event) }); 
    $("[id$='_Cancel']").bind('click', click); 

Để ngăn chặn các bài lại xảy ra ngay lập tức, loại bỏ mã onclick chèn vào bởi .net và ràng buộc nó sau của riêng bạn bằng cách sử dụng jQuery. Sử dụng event.stopImmediatePropagation(), để ngăn chặn các bài sau:

onCancelClick: function (event) { 

    var confirmResponse; 

    confirmResponse = confirm('No fee schedule will be created.\n\nAre you sure you want to cancel?'); 

    if (confirmResponse == true) { 

     showWait(); 
     event.target.disabled = 'true'; 

    } else { 

     event.stopImmediatePropagation(); 

    } 

}, 
-3

Đối với điều này bạn phải sử dụng nút đầu vào thuộc tính vô hiệu hóa tất cả các điều khiển

<script language="javascript" type="text/javascript"> 
    function MyDisableFunction() { 
     alert(`Now You Postback Start`); 
     $(":input").attr("disabled", true); 
     return true; 
    } 

</script> 

Fore biết thêm chi tiết kiểm tra this link

+1

quảng cáo trên blog cá nhân không được chấp nhận tại đây .. – rahularyansharma

0

Câu trả lời được cung cấp bởi Nick Craver là giải pháp tốt nhất mà tôi đã tìm thấy ở bất cứ đâu trên mạng. Tuy nhiên, có một trường hợp, nơi giải pháp không hoạt động tốt - khi biểu mẫu chứa các nút gửi trong UpdatePanel với thuộc tính UpdateMode được đặt thành thuộc tính "Có điều kiện" và/hoặc ChildrenAsTriggers được đặt thành false.

Trong những trường hợp này, nội dung của bảng cập nhật không tự động được làm mới khi đăng lại không đồng bộ đã hoàn tất. Vì vậy, nếu các bảng cập nhật này chứa bất kỳ nút gửi nào thì giải pháp đã cho sẽ làm cho các nút này bị vô hiệu hóa vĩnh viễn.

Việc tăng cường sau đây để các giải pháp xử lý vấn đề này bằng cách tái tạo điều kiện cho các nút sau một async, hoặc 'phần', postback:

var canProcessClicks = true; 

if (typeof (Sys) != 'undefined') { 
    // handle partial-postback 
    var requestManager = Sys.WebForms.PageRequestManager.getInstance(); 
    requestManager .add_initializeRequest(function() { 
     // postback started 
     canProcessClicks = false; 
    }); 
    requestManager .add_endRequest(function() { 
     // postback completed 
     canProcessClicks = true; 
    }); 
} 

$(function() { 
    $('input[type=submit]').on("click", function() { 
     return canProcessClicks ; 
    }); 
    $("#aspnetForm").submit(function() { 
     if (typeof (Sys) != 'undefined' && Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()) { 
      // this is an async postback so ignore because this is already handled 
     } else { 
      // full postback started 
      canProcessClicks = false; 
     } 
    }); 
}); 
Các vấn đề liên quan