Значение учетной записи ASP.Net при обратной передаче неверно?
У нас есть флажок, который первоначально отключен и проверен. Затем он активируется на стороне клиента через javascript. Если пользователь затем снимает флажок и нажимает кнопку для вызова обратной передачи, состояние флажка остается таким же, как отмечено на стороне сервера. Это явно нежелательное поведение. Вот пример.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="testcb.aspx.cs" Inherits="ESC.testcb" %>
<!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>
</head>
<body>
<form id="form1" runat="server">
<script type="text/javascript">
function buttonClick() {
var cb = document.getElementById('<%= CheckBox1.ClientID %>');
cb.disabled = false;
cb.parentNode.disabled = false;
}
</script>
<div>
<asp:CheckBox ID="CheckBox1" runat="server" Checked="true" Enabled="false" />
<asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="buttonClick(); return false;" />
<asp:Button ID="Button2" runat="server" Text="Button2" OnClick="button2Click" />
</div>
</form>
</body>
</html>
И код на стороне сервера:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ESC
{
public partial class testcb : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void button2Click(object sender, EventArgs e)
{
string h = "";
}
}
}
Итак, мы ломаем строку "строка h" и проверяем значение CheckBox1.Checked. Это правда, даже если он не отмечен в форме.
Ответы
Ответ 1
Это известная проблема с ASP.NET - по какой-то причине ASP.NET не будет обновлять флажок после обратной передачи, если он был отключен во время загрузки страницы и не был проверен для обратной передачи. Я не знаю точно, почему это происходит - если вы установите флажок, не выбранный по умолчанию, и выберите его, значение будет правильно изменено на сервере.
Обходной путь заключается в том, чтобы добавить скрытое поле к странице, которая представляет состояние флажка, а затем обновить значение поля до "ON" или "OFF", например, при каждом щелчке по кнопке.
Затем на сервере вы проверяете значение скрытого поля, а не флажок, так как скрытое поле всегда отправляется.
Ответ 2
У меня была аналогичная проблема с этим, когда свойство Checked объекта CheckBox
не обновлялось правильно, чтобы получить фактическое значение, которое вы можете проверить:
Request.Form[CheckBox1.UniqueID]
он будет 'on', если флажок установлен и null, если нет.
Ответ 3
Поскольку вы уже используете Javascript для управления состоянием элементов управления в браузере, я предлагаю вам просто отключить флажок в событии загрузки страницы. Тогда ваши postbacks будут работать нормально...
<head>
<script type="text/javascript">
function buttonClick() {
var cb = document.getElementById('<%= CheckBox1.ClientID %>');
cb.disabled = false;
cb.parentNode.disabled = false;
}
</script>
</head>
<body onload="document.getElementById('<%= CheckBox1.ClientID %>').disabled = true;">
<form id="form1" runat="server">
<div>
<asp:checkbox id="CheckBox1" runat="server" checked="true" />
<asp:button id="Button1" runat="server" text="Button" onclientclick="buttonClick(); return false;" />
<asp:button id="Button2" runat="server" text="Button2" onclick="button2Click" />
</div>
</form>
</body>
Ответ 4
Возможно, я не понимаю проблему правильно, но не можете ли вы просто использовать форму из запроса для получения значения CheckBox
? Поэтому в button2Click()
в коде за файлом вы сделаете следующее:
Request.Form[CheckBox1.UniqueID]
Ответ 5
Вы можете использовать что-то вроде этого.
if ((Request.Params["Checkbox1"] ?? "").ToString() == "on")
Если он не проверен, он не будет передавать его в первую очередь, но это должно учитывать это.
Ответ 6
Вот альтернативное решение, если вам не нужно перекомпилировать исходный код.
Он просто позволяет поставить флажок в течение секунды секунды перед отправкой формы.
1: добавьте следующий параметр в кнопку отправки: OnClientClick="EnableCheckbox()"
2: добавьте эту простую функцию где-нибудь на странице, чтобы включить ее
<script>
function EnableCheckbox() {
document.getElementById("<%=chkMyCheckbox.clientID %>").disabled = false;
}
</script>