Скрытое поле asp.net не сохраняет значение при обновлении кода
Я использую скрытое поле для хранения значения на странице asp.net. В основном я устанавливаю значение скрытого поля всякий раз, когда изменяется значение формы, то есть имя, дата и т.д. Поле находится на веб-форме, которая имеет главную страницу и находится в разделе содержимого:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<asp:HiddenField ID="hdnDirtyFlag" runat="server" Value='false' />
Я изменяю значение поля в javascript, вызывая функцию всякий раз, когда событие onchange запускается в других элементах управления в веб-форме:
<asp:TextBox CssClass="niceInput" ID="tbFirstName" runat="server" MaxLength="40" Width="150" onchange='SetHiddenVariable();'></asp:TextBox>
<script type="text/javascript">
function SetHiddenVariable() {
// Set the value of the hidden variable so we know a field has been updated
var hiddenControl = '<%= hdnDirtyFlag.ClientID %>';
document.getElementById(hiddenControl).value = 'true';
}
</script>
Пока все хорошо. Когда страница загружает значение скрытого поля, это "false" , и если я не изменю никаких значений в веб-форме, он останется ложным. Всякий раз, когда я меняю другой элемент управления, функция javascript вызывается, а значение скрытого поля обновляется до "true". Опять все в порядке.
После того, как я отправлю форму и обновил базу данных, я вернул значение скрытого поля в значение "false" в коде:
hdnDirtyFlag.Value = "false";
Но когда я нажимаю другую кнопку и делаю обратную передачу, значение скрытого поля по-прежнему остается "true".
Может кто-нибудь объяснить, почему это? Я прошел через код позади и сразу же после изменения значения, я вижу, что значение "false" . На странице есть asp: UpdatePanel, но скрытое поле не является частью этой панели.
EDIT:
Это код, который я использую для проверки значения поля в коде, находящегося во второй обратной передаче, после того, как на последнем шаге первой обратной передачи было установлено значение false. Значение по-прежнему остается истинным по второму возврату после того, как в javascript на стороне клиента было установлено значение true, а затем вернулось к false в коде, как показано выше:
if (hdnDirtyFlag.Value == "true")
{
UpdateSecurityObject();
}
Ответы
Ответ 1
Ваша проблема заключается в том, что скрытое поле находится за пределами панели обновления. Несмотря на то, что панель обновления имеет доступ ко всем элементам управления на странице во время обратной передачи (поскольку она действует как нормальная обратная передача), она НЕ обновляет никаких элементов управления на стороне клиента, которые находятся за пределами ContentTemplate. Таким образом, ваш код в коде, который меняет значение скрытого поля, не влияет на значение на стороне клиента. Поэтому во второй раз, когда вы нажимаете кнопку, оно все равно равно true.
Вам нужно будет либо a) поместить скрытое поле внутри UpdatePanel (или вы можете поместить его в свою панель с UpdateMode, установленным Always); или b) иметь некоторый javascript на стороне клиента, который запускается при завершении вызова UpdatePanel, который возвращает значение false.
Ответ 2
ViewState сохраняет значение, поэтому, когда страница перезагружает ViewState, в нем есть true, поэтому asp.net обновляет значение элемента управления с помощью true до того, как будет отображаться страница.
Измените текстовое поле на это:
<asp:HiddenField ID="hdnDirtyFlag" runat="server" Value='false' EnableViewState="false" />
Это предотвратит сохранение asp.net этого поля через postbacks, так как ваше намерение состоит в том, чтобы он устанавливал значение false каждый раз, когда страница загружается.