Постбэк JS и ASP.NET на стороне клиента

У меня есть клиентский JavaScript, который устанавливает поля формы. Когда страница публикуется обратно, эти поля сбрасываются.

Почему это? Разве значения полей не фиксируются и не помещаются в ViewState, когда происходит обратная передача?

РЕДАКТИРОВАТЬ: Когда я ломаю отладчик на Page_Load(), перед выполнением любого кода после обратной передачи значения поля формы пусты.


person core    schedule 20.04.2009    source источник


Ответы (5)


Элементы формы, которые заполняются из вашего клиентского javascript, отключены? Если это так, ASP.NET проигнорирует это значение.

Например:

<asp:TextBox ID="TextBox1" Enabled="False" Runat="Server" />

<script type="text/javascript">
    document.forms[0].elements["TextBox1"].style.disabled = false;
    document.forms[0].elements["TextBox1"].value = "Value set from Javascript";
</script>

Когда этот код запускается, ASP.NET считает, что текстовое поле отключено, и поэтому отбрасывает его значение в обратной передаче, поэтому значение TextBox1.Text всегда будет пустым. Насколько мне известно, такое поведение распространяется на все элементы формы. Если ASP.NET считает, что они отключены, а затем включаются и заполняются на стороне клиента, значение не будет доступно при обратной передаче.

person Mun    schedule 21.04.2009
comment
Хорошо поймал. Мне потребовалось немного времени, чтобы понять это. :) - person core; 21.04.2009

да. Похоже, у вас что-то еще не так (возможно, обработчик OnLoad, который не проверяет поле IsPostback и, следовательно, перезаписывает ваши измененные значения?).

person jsight    schedule 20.04.2009

Проверьте, что инициализируется на стороне сервера. Наиболее распространенная проблема, которую я видел, заключается в том, что любой код инициализации на стороне сервера не проверяет IsPackBack следующим образом:

if (!Page.IsPostBack) {

    // Do Work

}
person Jon Erickson    schedule 20.04.2009

Другая вещь, которую нужно проверить, это то, делаете ли вы обратную передачу или обратный вызов. Если вы выполняете обратный вызов, значения полей формы, отправленные обратно с обратным вызовом, являются теми, которые страница сначала отправила клиенту. По какой-то причине ASP.NET AJAX собирает эти значения и отправляет их при каждом обратном вызове вместо того, чтобы заново читать поле формы.

person Sebastian Good    schedule 20.04.2009

Это потому, что я установил enabled="false" в полях. Я изменил поля на readonly="true", и происходит то же самое.

Решение состояло в том, чтобы изменить поля только для чтения во время выполнения с помощью JS.

person core    schedule 21.04.2009