編輯ASP.NET控件的標記,然后保存在PostBack上

[英]Editing markup of an ASP.NET control then saving on PostBack


I am using jquery to append or remove a <ListItem> (rendered as <option>) from the <ListBox> (rendered as <select multiple="multiple">).

我正在使用jquery從 追加或刪除 (呈現為

The problem arises when I try to save on PostBack. The correct information is saved to the database. However, when the page is loaded on PostBack instead of the new data from the database being loaded, the old data from the initial <ListBox> is still there.

當我嘗試保存在PostBack上時出現問題。正確的信息將保存到數據庫中。但是,當在PostBack上加載頁面而不是正在加載的數據庫中的新數據時,來自初始 的舊數據仍然存在。

When I set Response.Expires = 0 and refresh the page that is loaded after PostBack everything is where it needs to be.

當我設置Response.Expires = 0並刷新PostBack之后加載的頁面時,一切都在它需要的位置。

I have tried: Response.Cache.SetCacheability(HttpCacheability.NoCache);
Cache.Remove("Add_Product.aspx");

我試過了:Response.Cache.SetCacheability(HttpCacheability.NoCache); Cache.Remove( “Add_Product.aspx”);

Also to bypass the problems with EventValidation I am setting EnableEventValidation="false".

另外為了繞過EventValidation的問題,我設置了EnableEventValidation =“false”。

So my question is how should I approach this problem? Is there an quick and easy way to force PostBack to load the fresh page?

所以我的問題是我應該如何處理這個問題?是否有一種快速簡便的方法來強制PostBack加載新頁面?

I would rather not have to redirect to the same page after the PostBack.

我不想在PostBack之后重定向到同一頁面。

1 个解决方案

#1


If you don't want to redirect to the same page after the postback (following the Post-Redirect-Get pattern, which can actually clean ASP.NET pages up tremendously!), your best options are to:

如果您不希望在回發后重定向到同一頁面(在Post-Redirect-Get模式之后,實際上可以非常清理ASP.NET頁面!),您最好的選擇是:

1) After you save the item to the database, retrieve your ListBox's DataSource and call ListBox.DataBind() again on the postback. (As a sidenote, the necessity of adding all this extra data retrieval and binding code is one of several reasons people move to the PRG pattern when working with ASP.NET.)

1)將項目保存到數據庫后,檢索ListBox的DataSource並在回發上再次調用ListBox.DataBind()。 (作為旁注,添加所有這些額外數據檢索和綁定代碼的必要性是人們在使用ASP.NET時轉移到PRG模式的幾個原因之一。)

2) Modify your codebehind class so that it adds the list item to the relevant WebControl when you post back to the page.

2)修改您的代碼隱藏類,以便在您回發到頁面時將列表項添加到相關的WebControl。

That is, when you save the new value to the database, add the new ListItem to your ListBox control too:

也就是說,當您將新值保存到數據庫時,也將新的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);
}

Now the value will be there when ASP.NET renders your HTML.

現在,當ASP.NET呈現您的HTML時,該值將存在。


Edit: added some more detail, to try to explain why there isn't a better solution.

編輯:添加更多細節,試圖解釋為什么沒有更好的解決方案。

When you add <option> elements to a <select> control on the client, those new option elements are not communicated to the server - there just isn't any mechanism for it.

當您將

That can be confusing because, as you've seen, you can still post the dynamically added option values to the server (though only if you turn off EnableEventValidation, which is risky as womp pointed out in comments).

這可能會令人困惑,因為正如您所見,您仍然可以將動態添加的選項值發布到服務器(盡管只有在您關閉EnableEventValidation時才會發出這種情況,這在評論中指出了womp指出的風險)。

However, unselected option elements are not communicated to web servers during post requests.

但是,在發布請求期間,未選擇的選項元素不會傳遞給Web服務器。

The question then is, how can ASP.NET rebuild the correct ListBox contents after a post request? First, it does whatever the code-behind tells it (ListBox.DataBind, ListBox.Items.Add, etc.). Second, if viewstate is enabled, it adds any option values that were saved to viewstate.

那么問題是,ASP.NET如何在發布請求后重建正確的ListBox內容?首先,它執行代碼隱藏的任何操作(ListBox.DataBind,ListBox.Items.Add等)。其次,如果啟用了viewstate,則會添加保存到viewstate的所有選項值。

ASP.NET could conceivably have added a third rule, "if the posted value for the select list is not already in the ListBox, add that value to the ListBox." But since it is a security risk to allow arbitrary values to be posted to a page (at least when you have established a set of expected values, as with a ListBox), Microsoft decided against it. (Additionally, consider what you would do about dynamically added ListBox values that failed validation - should those be added when the ListBox is rebuilt or not?)

可以想象,ASP.NET可以添加第三條規則,“如果選擇列表的已發布值不在ListBox中,則將該值添加到ListBox中。”但是,由於允許將任意值發布到頁面是一種安全風險(至少當您已經建立了一組預期值時,就像使用ListBox一樣),Microsoft決定反對它。 (另外,考慮一下動態添加的ListBox值會對驗證失敗的方法做什么 - 是否應該在重建ListBox時添加?)


注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:https://www.itdaan.com/blog/2009/07/10/5e52c0dc4b3467f612e3dfa0bce5c8dc.html



 
  © 2014-2022 ITdaan.com 联系我们: