Это старый пост, однако я не думаю, что на него полностью ответили.
Во-первых, в ASP.NET WebForms вы отправляете запрос HTTP GET
на веб-сервер, который обрабатывает ваш запрос ивыводит HTML-код на стороне клиента для отображения браузером.
Поскольку вы взаимодействуете с серверным элементом управления, значения содержатся в скрытом поле ввода VIEWSTATE
для свойств (например, логическое значение для Enabled
).
Когда вы нажимаете кнопку, она отправляет запрос HTTP POST
на веб-сервер на той же странице.Вот почему событие Page_Load
вызывается при нажатии кнопки.
После обработки запроса HTTP POST
он возвращает HTML-код для повторного рендеринга браузера.По этой причине, если у вас есть следующий код в вашем Page_Load
событии:
if (Page.IsPostBack) { Button3.Enabled = false; }
Он не покажет пользователю, что он отключен, пока запрос HTTP POST
не будет обработан и не вернетобновленный код на стороне клиента.
Из первоначального вопроса выяснилось, что серверу потребовалось несколько секунд, чтобы вернуть ответ, поэтому при повторном нажатии кнопки может вызываться несколько событий обратной передачи.
Простой (но раздражающий) способ решения вашей проблемы - использовать обычный HTML button
, выполняющий function
в JavaScript, который отключает его и запускает событие onclick серверного элемента управления.Тогда проблема заключается в том, что, когда запрос HTTP POST
возвращает ответ, он отображает обычный HTML button
как включенный.Чтобы решить эту проблему, вы можете просто отключить его в JavaScript, используя встроенный код ASP.NET.Вот пример:
.ASPX файл
<button id="clientButton" onclick="javascript:update();" />
<asp:Button ID="serverButton" OnClick="serverButton_OnClick" runat="server" />
<script type="text/javascript">
<% if (Page.IsPostBack) { %>
document.getElementById("clientButton").enabled = false;
<% } %>
function update() {
document.getElementById("clientButton").enabled = false;
document.getElementById("<%= serverButton.ClientID %>").click();
}
</script>
<style type="text/css">
#<%= serverButton.ClientID %> {
visibility: hidden;
display: none;
}
</style>
.ASPX.CS File
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
// Triggered when serverButton has 'javascript:click()' triggered
}
}