Палец вверх 10
Перевод
Перевод

ASP.NET AJAX Toolkit - 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?

asp.net calendarextender
задан user70192 5 июн. 2009 г., 21:33:28
источник

9 ответов

Решение 9
Перевод
Перевод

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

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

ответ дан Matthew Jones 5 июн. 2009 г., 22:38:58
источник
Палец вверх 12
Перевод
Перевод

Конечно, вы должны сделать так, как уже предлагали другие: установить поле 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]);
        }
    }
}
ответ дан taeda 15 апр. 2012 г., 8:20:57
источник
Палец вверх 3
Перевод
Перевод
protected void Page_Load(object sender, EventArgs e)
{
    txt_sdate.Text = Request[txt_sdate.UniqueID];
}
ответ дан Manish Sharma 2 июн. 2011 г., 15:46:54
источник
Палец вверх 2
Перевод
Перевод

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

protected void Page_Load(object sender, EventArgs e){
    TextBox1.Attributes.Add("readonly", "readonly");
    // ...
}
ответ дан germ13 22 дек. 2011 г., 14:21:03
источник
Палец вверх 1
Перевод
Перевод

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

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

C #

protected void Submit(object sender, EventArgs e)
{
   string date = Request.Form[txtDate.UniqueID];
}
ответ дан rofans91 17 нояб. 2011 г., 4:56:54
источник
Палец вверх 0
Перевод
Перевод

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

ответ дан n8wrl 5 июн. 2009 г., 22:43:30
источник
Палец вверх 0
Перевод
Перевод

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

ответ дан BJLewies 4 дек. 2009 г., 11:21:03
источник
Палец вверх 0
Перевод
Перевод

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

ответ дан Harry 17 дек. 2016 г., 5:30:28
источник
Палец вверх -1
Перевод
Перевод

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

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

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

ответ дан HariHaravelan 25 окт. 2013 г., 9:21:36
источник