ASP.NET AJAX Toolkit - CalendarExtender reset on Postback

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

  • Текстовое поле, которое является ReadOnly. Этот TextBox является TargetControl CalendarExtender
  • Список 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, составляет reset до текущей даты. Кроме того, если я смотрю на свойство Text dateTextBox, оно равно string.Empty.

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

Ответ 1

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

EDIT: Хорошо, у меня есть ответ для вас. В соответствии с на этот вопрос форума, только те элементы, которые читаются, не отправляются обратно на сервер. Поэтому, когда вы выполняете обратную передачу, вы потеряете значение в элементе управления, доступным только для чтения. Вам не нужно будет читать только контрольные данные.

Ответ 2

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

... но вы также должны сделать следующее внутри 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]);
        }
    }
}

Ответ 3

protected void Page_Load(object sender, EventArgs e)
{
    txt_sdate.Text = Request[txt_sdate.UniqueID];
}

Ответ 4

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

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

Ответ 5

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

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

С#

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

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