代码之家  ›  专栏  ›  技术社区  ›  Tom

编辑ASP.NET控件的标记,然后在回发时保存

  •  0
  • Tom  · 技术社区  · 17 年前

    我正在使用jquery追加或删除<列表项>(作为<选项>)从<列表框>(呈现为<select multiple=“multiple”>)。

    当我试图在回发时保存时,问题就出现了。正确的信息将保存到数据库中。但是,当在回发时加载页面而不是加载数据库中的新数据时,初始<列表框>仍然存在。

    我试过: Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Cache.Remove(“Add_Product.aspx”);

    另外,为了绕过EventValidation的问题,我设置EnableEventValidation=“false”。

    我宁愿不必在回发后重定向到同一页。

    1 回复  |  直到 17 年前
        1
  •  2
  •   Jeff Sternal    17 年前

    如果您不想在回发后重定向到同一页面(在 Post-Redirect-Get pattern ,这实际上可以极大地清理ASP.NET页面!),您的最佳选择是:

    ListBox 的 DataSource ListBox.DataBind() 又是回邮。(作为旁注,添加所有这些额外的数据检索和绑定代码的必要性是人们在使用ASP.NET时转向PRG模式的几个原因之一。)

    也就是说,在将新值保存到数据库时,添加新值 ListItem 给你 控制也包括:

    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> 控制客户端,这些新的 option

    选项 EnableEventValidation ,正如womp在评论中指出的那样,这是有风险的)。

    然而 未选择 post请求期间,选项元素不会与web服务器通信。

    接下来的问题是,ASP.NET如何在post请求后重建正确的列表框内容?首先,它执行后面代码告诉它的任何操作(ListBox.DataBind、ListBox.Items.Add等)。其次,如果启用了viewstate,则会添加保存到viewstate的任何选项值。

    ASP.NET可能会添加第三条规则,“如果选择列表的已发布值不在列表框中,请将该值添加到列表框中。”但由于允许将任意值发布到页面(至少在您建立了一组预期值(如列表框)时)存在安全风险,Microsoft决定不这样做。(另外,考虑一下您对动态验证失败的ListBox值应该做些什么——应该在重建ListBox时添加那些值吗?)