Набор инструментов ASP.NET AJAX - CalendarExtender сбрасывается при обратной передаче

У меня есть страница ASP.NET с двумя входными элементами:

  1. TextBox только для чтения. Этот TextBox является TargetControl для CalendarExtender
  2. DropDownList с AutoPostBack = true

Вот код:

<table border="0" cellpadding="0" cellspacing="0">
  <tr><td colspan="2">Date:</td></tr>
  <tr><td colspan="2">
    <asp:TextBox ID="dateTextBox" runat="server" ReadOnly="true" />
    <ajax:CalendarExtender ID="datePicker" runat="server" Format="MM/dd/yyyy" OnLoad="datePicker_Load" TargetControlID="dateTextBox" />
  </td></tr>

  <tr><td colspan="2">Select an Option:</td></tr>
  <tr>
    <td>Name:&nbsp;</td>
    <td><asp:DropDownList ID="optionsDropDownList" runat="server" AutoPostBack="true"  
      OnLoad="optionsDropDownList_Load" 
      OnSelectedIndexChanged="optionsDropDownList_SelectedIndexChanged" 
      DataTextField="Name" DataValueField="ID" />
  </td></tr>

  <tr><td><asp:Button ID="saveButton" runat="server" Text="Save" OnClick="saveButton_Click" /></td></tr>
</table>

Когда DropDownList отправляет обратно, дата, выбранная пользователем с помощью datePicker, сбрасывается на текущую дату. Кроме того, если я посмотрю на свойство Text dateTextBox, оно равно string.Empty.

Как мне сохранить дату, выбранную пользователем в PostBack?


person user70192    schedule 05.06.2009    source источник


Ответы (8)


Тот факт, что текстовое поле только читается, кажется, вызывает эту проблему. Я продублировал вашу проблему, не используя кода ни в одном из связанных событий, и дата все равно исчезла. Однако когда я изменил текстовое поле на ReadOnly = False, все заработало. Вам нужно, чтобы текстовое поле было доступно только для чтения, или вы можете отключить его или проверить введенную дату?

РЕДАКТИРОВАТЬ: Хорошо, у меня есть для вас ответ. Согласно этому вопросу на форуме элементы управления только для чтения не отправляются обратно на сервер. Итак, когда вы выполняете обратную передачу, вы потеряете значение в элементе управления только для чтения. Вам не нужно делать элемент управления только для чтения.

person Matthew Jones    schedule 05.06.2009
comment
Голосование против, потому что я считаю, что ответ @taeda - верный ответ на эту проблему. - person rlb.usa; 29.01.2013

Конечно, вы должны сделать то, что уже предлагали другие: установить поле readonly динамически, а не в разметке, и убедиться, что вы случайно не сбрасываете значение в Page_Load() во время обратной передачи ...

... но вы также должны сделать следующее внутри Page_Load(), потому что объект CalendarExtender имеет внутреннюю копию даты, которую необходимо принудительно изменить:

if (IsPostBack)  // do this ONLY during postbacks
{
    if (Request[txtDate.UniqueID] != null)
    {
        if (Request[txtDate.UniqueID].Length > 0)
        {
            txtDate.Text = Request[txtDate.UniqueID];
            txtDateExtender.SelectedDate = DateTime.Parse(Request[txtDate.UniqueID]);
        }
    }
}
person taeda    schedule 15.04.2012
comment
Это решение, которое сработало для меня. Я попытался сделать свое текстовое поле readonly = false и enableviewstate = true, но безуспешно. Но когда я вручную устанавливаю выбранную дату элемента управления календарем на дату текстового поля, все в порядке и работает правильно. - person rlb.usa; 29.01.2013

Если вы хотите, чтобы содержимое текстового поля запомнилось после обратной передачи и по-прежнему сохраняло его как элемент управления только для чтения, вам необходимо удалить атрибут readonly из разметки и добавить его в загрузку страницы с выделенным кодом:

protected void Page_Load(object sender, EventArgs e){
    TextBox1.Attributes.Add("readonly", "readonly");
    // ...
}
person germ13    schedule 22.12.2011

Решение проблемы - использование коллекций Request.Form. Поскольку в этой коллекции есть значения всех полей, которые отправляются обратно на сервер, а также значения, которые устанавливаются с использованием клиентских сценариев, таких как JavaScript.

Таким образом, нам нужно немного изменить способ получения данных на стороне сервера значений.

C#

protected void Submit(object sender, EventArgs e)
{
   string date = Request.Form[txtDate.UniqueID];
}
person rofans91    schedule 17.11.2011

Я подозреваю, что ваш datePicker_Load что-то устанавливает и не проверяет, находится ли он в обратной передаче. Это заставляло бы это происходить каждый раз и выглядело бы так, как будто он «перезагружается».

person n8wrl    schedule 05.06.2009

Вместо установки ReadOnly = "False" установите Enabled = "False". Это должно решить вашу проблему.

person BJLewies    schedule 04.12.2009
comment
Насколько я понимаю, не работает - вы все равно теряете значение в отключенном поле при обратной передаче. - person CodeClimber; 05.10.2011

Ответ @taeda сработал для меня. К вашему сведению, если кто-то использует enabled = "false" вместо readonly = "true", он не сможет использовать этот ответ, потому что Request[TxtDate.UniqueId] вызовет нулевое исключение.

person Harry    schedule 17.12.2016

Это не проблема сохранения, после настройки readonly = true значение конкретного текстового поля не возвращается обратно на сервер, поэтому

Используйте contentEditable="false" и сделано readonly = false

это предотвратит ввод значения, отличного от выбора Calendar Extender, также возвращает значение текстового поля обратно на сервер

person HariHaravelan    schedule 25.10.2013