2009-06-05 4 views
10

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

  1. текстового поля, который предназначен только для чтения. Это TextBox является TargetControl из CalendarExtender
  2. А DropDownList с AutoPostBack = истинной

Вот код:

<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

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

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

+3

Downvoting, потому что я считаю, что ответ @ taeda является истинным ответом на эту проблему. –

0

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

0

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

+1

Не работает, насколько я вижу - вы по-прежнему теряете значение в отключенном поле при обратной передаче. – CodeClimber

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

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

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

C#

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

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

protected void Page_Load(object sender, EventArgs e){ 
    TextBox1.Attributes.Add("readonly", "readonly"); 
    // ... 
} 
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]); 
     } 
    } 
} 
+1

Это решение, которое сработало для меня. Я попытался сделать свой текстовый файл readonly = false и enableviewstate = true без успеха. Но когда я вручную установил выбранную дату календаря на дату текстового поля, все будет нормально и работает правильно. –

-1

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

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

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

0

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

Смежные вопросы