You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Asp:Calendar点击按钮后始终返回默认日期而非用户选中日期的问题

问题原因分析

我来帮你拆解下这个问题的核心原因:

  • HiddenField不在UpdatePanel范围内:你的hdnAllowedFrom放在UpdatePanel外面,而Calendar的SelectionChanged触发的是UpdatePanel的异步回发(Partial Postback)。UpdatePanel只会更新自身ContentTemplate内部的DOM元素,外面的HiddenField不会被同步更新——哪怕你在服务器端已经修改了它的Value,客户端浏览器里的HiddenField还是原来的默认值。
  • 按钮完全阻止了回发:按钮的OnClientClick="return false;"彻底禁止了任何回发操作,点击按钮时没有和服务器端的交互,前端JS只能读取客户端DOM里的旧值,自然拿不到服务器端更新后的内容。
  • Session的局限性:Session是服务器端存储的,在不触发回发的情况下,前端JS无法直接访问Session值,所以用Session也解决不了前端读取最新值的问题。
解决方案

根据你的需求,这里有几个可行的解决办法:

方案1:把HiddenField移到UpdatePanel内部

这是最简单的办法,只需要调整控件位置,让hdnAllowedFrom处于UpdatePanel的ContentTemplate中:

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
    <asp:Calendar id="Calendar1" runat="server" AutoPostback="false" SelectionMode="Day" Font-Size="10pt" BorderColor="White" BackColor="White" OnSelectionChanged="DateChange_UploadAllowedFrom" Width="216px" ForeColor="Black" Font-Names="Verdana" Height="188px" BorderWidth="1px" NextPrevFormat="ShortMonth">
        <SelectedDayStyle Font-Bold="true" ForeColor="black" BackColor="#ffe9e9"></SelectedDayStyle>
        <OtherMonthDayStyle ForeColor="White"></OtherMonthDayStyle>
        <NextPrevStyle Font-Size="8pt" Font-Bold="True" ForeColor="#333333" VerticalAlign="Bottom"></NextPrevStyle>
        <DayHeaderStyle Font-Size="8pt" Font-Bold="True"></DayHeaderStyle>
        <TitleStyle Font-Size="10pt" Font-Bold="True" ForeColor="#333399" BackColor="#ffe9e9"></TitleStyle>
    </asp:Calendar>
    <!-- 将HiddenField移到UpdatePanel内部 -->
    <asp:HiddenField ID="hdnAllowedFrom" runat="server" Value="08/08/2018 12:00:00" />
</ContentTemplate>
</asp:UpdatePanel>
<asp:Button ID="btnSaveChanges" runat="server" Width="120px" Height="50px" Text="Save Dates" OnClientClick="return false;"/>

这样当Calendar触发异步回发时,UpdatePanel会同步更新内部的HiddenField,前端就能读取到最新的选中日期值了。

方案2:用ScriptManager注册客户端脚本直接更新前端HiddenField

如果不想移动HiddenField的位置,可以在服务器端的DateChange_UploadAllowedFrom方法里,通过ScriptManager输出一段JS代码,直接修改客户端HiddenField的value:

protected void DateChange_UploadAllowedFrom(object sender, EventArgs e) {
    string selectedDate = Session["UploadAllowedFrom"].ToString();
    // 注册客户端脚本,更新前端的HiddenField
    ScriptManager.RegisterStartupScript(this, GetType(), "UpdateHiddenField", 
        $"document.getElementById('{hdnAllowedFrom.ClientID}').value = '{selectedDate}';", 
        true);
}

这段代码会在异步回发完成后,自动执行JS把最新的日期值写入客户端的HiddenField,这样点击按钮时就能读取到最新值了。

方案3:取消按钮的回发阻止(如果业务允许)

如果你的按钮不需要完全阻止回发,只是想先做一些前端验证再提交,可以修改OnClientClick逻辑:

<asp:Button ID="btnSaveChanges" runat="server" Width="120px" Height="50px" Text="Save Dates" OnClientClick="return validateAndSubmit();"/>

然后写对应的JS函数:

function validateAndSubmit() {
    // 这里编写你的前端验证逻辑
    // 验证通过返回true触发回发,服务器端就能直接读取hdnAllowedFrom的最新值
    // 验证不通过返回false阻止回发
    return true;
}

这种情况下,服务器端就能在按钮的点击事件里直接获取到更新后的HiddenField值了。

内容的提问来源于stack exchange,提问作者Eray Balkanli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:30:55