[英]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);

我試過了: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?


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


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:


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.


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


protected void Save_Click(object sender, EventArgs e) {

  // ... Code to save the new value to your database ...
  ListItem newItem = new ListItem(text, value);

Now the value will be there when ASP.NET renders your 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).


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


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 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時添加?)



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