【问题标题】:ASP.NET AJAX Toolkit - CalendarExtender is reset on PostbackASP.NET AJAX 工具包 - CalendarExtender 在回发时重置
【发布时间】:2010-10-31 17:22:46
【问题描述】:

我有一个包含两个输入元素的 ASP.NET 页面:

  1. 只读的文本框。此 TextBox 是 CalendarExtender 的 TargetControl
  2. 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 选择的日期将重置为当前日期。另外,如果我查看dateTextBox的Text属性,它等于string.Empty。

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

【问题讨论】:

    标签: asp.net calendarextender


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:
        protected void Page_Load(object sender, EventArgs e)
        {
            txt_sdate.Text = Request[txt_sdate.UniqueID];
        }
        

        【讨论】:

          【解决方案4】:

          当然,您必须按照其他人的建议:动态设置 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]);
                  }
              }
          }
          

          【讨论】:

          • 这是对我有用的解决方案。我尝试使我的文本框 readonly=false 和 enableviewstate=true 没有成功。但是当我手动将日历控件的选定日期设置为文本框日期时,一切都很好并且工作正常。
          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            因此,我们需要对获取值服务器端的方式进行一些小改动。

            C#

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

              • 据我所知不起作用 - 您仍然会在回发时丢失 disabled 字段中的值。
              【解决方案8】:

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

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

              【讨论】:

              • 投反对票,因为我相信@taeda 的回答是这个问题的真正答案。
              【解决方案9】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多