10

我有一个 ASP.NET 页面,它有两个输入元素:

  1. 一个只读的文本框。此 TextBox 是 CalendarExtender 的 TargetControl
  2. 具有 AutoPostBack=true 的 DropDownList

这是代码:

<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 选择的日期将重置为当前日期。另外,如果我查看 dateTextBox 的 Text 属性,它等于 string.Empty。

如何保留用户在 PostBack 上选择的日期?

4

9 回答 9

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]);
        }
    }
}
于 2012-04-15T04:20:57.800 回答
11

文本框是只读的这一事实似乎导致了这个问题。我在任何绑定事件中都没有使用代码复制了您的问题,但日期仍然消失了。但是,当我将文本框更改为 ReadOnly=False 时,它​​工作正常。您是否需要将文本框设为只读,还是可以禁用它或验证输入的日期?

编辑:好的,我有一个答案给你。根据这个论坛问题,只读控件不会发回服务器。因此,当您进行回发时,您将丢失只读控件中的值。您不需要将控件设为只读。

于 2009-06-05T18:38:58.483 回答
3
protected void Page_Load(object sender, EventArgs e)
{
    txt_sdate.Text = Request[txt_sdate.UniqueID];
}
于 2011-06-02T11:46:54.983 回答
2

如果您希望在回发后记住文本框内容并仍将其保留为只读控件,则必须从标记中删除只读属性,并将其添加到代码隐藏页面加载中:

protected void Page_Load(object sender, EventArgs e){
    TextBox1.Attributes.Add("readonly", "readonly");
    // ...
}
于 2011-12-22T10:21:03.467 回答
1

该问题的解决方案是使用 Request.Form 集合。由于此集合具有回发到服务器的所有字段的值,并且它还具有使用 JavaScript 等客户端脚本设置的值。

因此,我们需要在获取价值服务器端的方式上做一个小的改变。

C#

protected void Submit(object sender, EventArgs e)
{
   string date = Request.Form[txtDate.UniqueID];
}
于 2011-11-17T00:56:54.403 回答
0

我怀疑您的 datePicker_Load 正在设置某些内容,而不是检查它是否在回发中。这会让它每次都发生,看起来就像是在“重置”。

于 2009-06-05T18:43:30.720 回答
0

不要设置 ReadOnly="False",而是设置 Enabled="False"。这应该可以解决您的问题。

于 2009-12-04T08:21:03.897 回答
0

@taeda 的回答对我有用。仅供参考,如果有人使用enabled = "false"而不是readonly = "true"无法使用该答案,因为Request[TxtDate.UniqueId]会抛出空异常。

于 2016-12-17T02:30:28.813 回答
-1

这不是保存的问题,设置 readonly = true特定文本框的值后不会返回到服务器,所以

使用contentEditable="false"制作 readonly = false

这将阻止输入除日历扩展器之外的值的选择还会将文本框的值返回给服务器

于 2013-10-25T05:21:36.133 回答