如果您不想在回发后重定向到同一页面(遵循Post-Redirect-Get pattern,它实际上可以极大地清理 ASP.NET 页面!),您最好的选择是:
1) 将项目保存到数据库后,检索您的ListBox 的DataSource 并在回发时再次调用ListBox.DataBind()。 (作为旁注,添加所有这些额外的数据检索和绑定代码的必要性是人们在使用 ASP.NET 时转向 PRG 模式的几个原因之一。)
2) 修改您的代码隐藏类,以便在您回发到页面时将列表项添加到相关的 WebControl。
也就是说,当您将新值保存到数据库时,也将新的ListItem 添加到您的ListBox 控件中:
protected void Save_Click(object sender, EventArgs e) {
// ... Code to save the new value to your database ...
ListItem newItem = new ListItem(text, value);
ListBox.Items.Add(listItem);
}
现在,当 ASP.NET 呈现您的 HTML 时,该值将存在。
编辑:添加了更多细节,试图解释为什么没有更好的解决方案。
当您将 <option> 元素添加到客户端上的 <select> 控件时,这些新的 option 元素不会与服务器通信 - 只是没有任何机制。
这可能会令人困惑,因为正如您所见,您仍然可以将动态添加的 option 值发布到服务器(尽管只有在您关闭 EnableEventValidation 的情况下,这是有风险的,正如 womp 在 cmets 中指出的那样) .
但是,unselected 选项元素在发布请求期间不会与网络服务器通信。
那么问题是,ASP.NET 如何在发布请求后重建正确的 ListBox 内容?首先,它执行代码隐藏告诉它的任何事情(ListBox.DataBind、ListBox.Items.Add 等)。其次,如果启用了视图状态,它会将保存的任何选项值添加到视图状态。
可以想象,ASP.NET 添加了第三条规则,“如果选择列表的发布值尚未在 ListBox 中,则将该值添加到 ListBox。”但是由于允许将任意值发布到页面是一种安全风险(至少当您已经建立了一组预期值时,例如使用 ListBox),Microsoft 决定反对它。 (此外,考虑一下您将如何处理动态添加的未通过验证的 ListBox 值 - 是否应该在重建 ListBox 时添加这些值?)