编辑ASP.NET控件的标记,然后保存在PostBack上

时间:2009-07-10 14:48:44

标签: asp.net jquery caching postback

我正在使用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之后不必重定向到同一页面。

1 个答案:

答案 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时添加?)