我正在使用jquery追加或删除< ListItem> (< ListBox>呈现为< option>) (呈现为< select multiple =“multiple”>)。
当我尝试保存在PostBack上时出现问题。正确的信息将保存到数据库中。但是,当在PostBack上加载页面而不是正在加载的数据库中的新数据时,来自初始< ListBox>的旧数据。还在那里。
当我设置Response.Expires = 0并刷新PostBack之后加载的页面时,一切都在它需要的位置。
我试过了:
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Cache.Remove( “Add_Product.aspx”);
还要绕过EventValidation的问题我设置了EnableEventValidation =“false”。
所以我的问题是我该如何处理这个问题?是否有一种快速简便的方法可以强制PostBack加载新页面?
我宁愿在PostBack之后不必重定向到同一页面。
答案 0 :(得分:2)
如果您不希望在回发后重定向到同一页面(Post-Redirect-Get pattern之后,实际上可以非常清理ASP.NET页面!),您最好的选择是:
1)将项目保存到数据库后,检索ListBox
的{{1}}并在回发时再次呼叫DataSource
。 (作为旁注,添加所有这些额外数据检索和绑定代码的必要性是人们在使用ASP.NET时转移到PRG模式的几个原因之一。)
2)修改您的代码隐藏类,以便在您回发到页面时将列表项添加到相关的WebControl。
也就是说,当您将新值保存到数据库时,也可以将新的ListBox.DataBind()
添加到ListItem
控件中:
ListBox
现在,当ASP.NET呈现您的HTML时,该值将存在。
编辑:添加了更多细节,试图解释为什么没有更好的解决方案。
当您向客户端上的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);
}
控件添加<option>
个元素时,这些新的<select>
元素不会传递给服务器 - 它没有任何机制。< / p>
这可能令人困惑,因为正如您所见,您仍然可以将动态添加的option
值发布到服务器(尽管只有在您关闭option
时才有效,这是有风险的,因为womp指向在评论中)。
但是,在帖子请求期间,未选择的选项元素不会传达给Web服务器。
接下来的问题是,ASP.NET如何在发布请求后重建正确的ListBox内容?首先,它执行代码隐藏的任何操作(ListBox.DataBind,ListBox.Items.Add等)。其次,如果启用了viewstate,它会添加保存到viewstate的任何选项值。
可以想象,ASP.NET可以添加第三条规则,“如果选择列表的已发布值不在ListBox中,则将该值添加到ListBox中。”但是,由于允许将任意值发布到页面是一种安全风险(至少当您已经建立了一组预期值时,就像使用ListBox一样),Microsoft决定反对它。 (另外,考虑一下动态添加的ListBox值会对验证失败的方法做什么 - 是否应该在重建ListBox时添加?)