ASP.NET AJAX Toolkit - CalendarExtender сбрасывается при обратной передаче - PullRequest
10 голосов
/ 05 июня 2009

У меня есть страница 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?

Ответы [ 9 ]

12 голосов
/ 15 апреля 2012

Конечно, вы должны сделать, как уже предлагали другие: установить 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]);
        }
    }
}
10 голосов
/ 05 июня 2009

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

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

3 голосов
/ 02 июня 2011
protected void Page_Load(object sender, EventArgs e)
{
    txt_sdate.Text = Request[txt_sdate.UniqueID];
}
2 голосов
/ 22 декабря 2011

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

protected void Page_Load(object sender, EventArgs e){
    TextBox1.Attributes.Add("readonly", "readonly");
    // ...
}
1 голос
/ 17 ноября 2011

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

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

C #

protected void Submit(object sender, EventArgs e)
{
   string date = Request.Form[txtDate.UniqueID];
}
0 голосов
/ 17 декабря 2016

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

0 голосов
/ 25 октября 2013

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

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

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

0 голосов
/ 04 декабря 2009

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

0 голосов
/ 05 июня 2009

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

...