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
相关产品推荐
相关产品推荐

