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: </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, также возвращает значение текстового поля на сервер