【发布时间】:2010-10-14 16:10:52
【问题描述】:
我正在寻找在 DropdownList 自动回发之前触发的事件,以在 ViewState 中保存 Listbox 项目(使用 JS 填充)。
我尝试了OnSelectedIndexChanged 事件,但它触发得太晚了。
这可以做到吗?如何做到?
【问题讨论】:
-
您是否尝试通过客户端代码修改视图状态?
我正在寻找在 DropdownList 自动回发之前触发的事件,以在 ViewState 中保存 Listbox 项目(使用 JS 填充)。
我尝试了OnSelectedIndexChanged 事件,但它触发得太晚了。
这可以做到吗?如何做到?
【问题讨论】:
使用 ViewState 无法做到这一点。 ViewState 由服务器设置。客户端无法在 JavaScript 中修改。
建议使用 JavaScript 或 jQuery 选择以下选项之一:
然后,您可以在页面回发后检测这些更改。
设置您的下拉菜单以修改隐藏元素。
$(document).ready(function() {
$('#<%=DropDownList1.ClientID %>').change(function() {
$("#myHiddenInput").val("changed!");
});
});
....
<input type="hidden" id="myHiddenInput" />
您的 DropDownList 将照常发回。
【讨论】:
在页面加载之前发生以下所有事件:
查看ASP.NET Page Lice Cycle 了解更多信息。
LoadViewState 发生在页面的加载周期中,因此请查看之前的事件。
另外,您是否考虑过使用TrackViewState 方法?可能正是您在这种情况下所需要的...
【讨论】:
您尝试过OnChange 事件吗?看看this post
更新:使用隐藏字段将自定义数据传递到服务器端。您不能修改视图状态。
另外,there is a nice post 由 Scott Mitchell 撰写。
【讨论】:
我知道您已经为这个问题标记了答案,但我认为您提出问题的原因是您的视图状态未通过验证,因为您的列表框不再包含与呈现页面时相同的选项?简单的答案是禁用页面上的事件验证:
<%@ Page EnableEventValidation="false" %>
在您的示例中,因为您在呈现页面时使用 x 个项目填充了列表框,并且您正在手动添加项目,所以 ASP.NET 启动并运行“嘿,你问过对于不存在的选项y”,并相应地引发异常。
【讨论】: