【问题标题】:Editing markup of an ASP.NET control then saving on PostBack编辑 ASP.NET 控件的标记,然后保存在 PostBack
【发布时间】:2009-07-10 14:48:43
【问题描述】:

我正在使用 jquery 从 (呈现为

当我尝试在 PostBack 上保存时出现问题。正确的信息被保存到数据库中。但是,当在 PostBack 上加载页面而不是加载数据库中的新数据时,初始 中的旧数据仍然存在。

当我设置 Response.Expires = 0 并刷新在 PostBack 之后加载的页面时,一切都在它需要的地方。

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

为了绕过 EventValidation 的问题,我设置了 EnableEventValidation="false"。

所以我的问题是我应该如何解决这个问题?有没有一种快速简便的方法来强制 PostBack 加载新页面?

我宁愿不必在 PostBack 之后重定向到同一页面。

【问题讨论】:

    标签: asp.net jquery caching postback


    【解决方案1】:

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

    1) 将项目保存到数据库后,检索您的ListBoxDataSource 并在回发时再次调用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 时添加这些值?)

    【讨论】:

    • 您还应该避免禁用 EventValidation - 它是作为一种安全措施来防止注入您的页面。
    • 感谢您的意见。我正在使用您的第一个建议。不过,我觉得应该有更好的解决方案。
    • 很高兴为您提供帮助,但很抱歉我无法为您提供更令人满意的解决方案 - 我已经更新了答案,试图解释为什么没有这样的事情。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2011-12-05
    相关资源
    最近更新 更多