2008-10-24 34 views
2

我有以下情況:在ASP.Net中向客戶端發送大量複選框的最佳方式是什麼?

的用戶將定義一個頁面上有一定過濾器,並回傳我會使用過濾器查詢數據庫和一堆匹配的記錄返回給用戶,每一個旁的複選框所以他可以選擇是否對每個記錄採取行動。

在傳統的ASP/PHP中,我可以生成很多名爲「chk __ *」的控件,然後在回發中遍歷所有$ POST條目,查找前綴爲「chk」的條目。

在ASP.Net 2.0中執行此操作的最佳方法是什麼?

我可以通過實施與包含複選框模板中繼器容易做到這一點,中繼器綁定到一個數據集,然後在第二回傳,我只是做:

For Each it As RepeaterItem In repContacts.Items 
    Dim chkTemp As CheckBox = DirectCast(it.FindControl("cbSelect"), CheckBox) 
    If chkTemp.Checked Then 

    End If 
Next 

然而,這具有輕微給我一個巨大的Viewstate的缺點,這是非常糟糕的,因爲客戶端需要重新上傳整個視圖狀態到服務器,這些人可能會通過蹩腳的連接使用我的網站。

還有其他想法嗎? (我還可以動態創建控件,並通過迭代的Request.Form在過去,不過,我一直在尋找一個更清潔

回答

4

以與傳統ASP中的相同方式進行操作。使用<輸入類型=「複選框」>而不是< asp:複選框>。你可以使用Request.Form

0

禁用ViewState中。如果它不能做嘗試使用Session to store the view state

+0

我可以禁用Viewstate的唯一方法是,如果我在Page_Load事件(如此,在Page_Init)之前重新生成控件樹。 但那時我無法讀取過濾器控件的數據來重新查詢數據庫(至少不乾淨)。 – 2008-10-24 23:54:41

+0

至於在其他地方存儲Viewstate,這似乎是更多的工作,這是值得的,老實說... 感謝您的想法! – 2008-10-24 23:55:20

+0

過濾器控件的數據不存在於文本框中或頁面上的某些內容中,其值將由後期保留? – Ramesh 2008-10-25 00:09:18

2

我推薦經典的ASP解決方案,當面臨荒謬的ViewState條件時,我們很遺憾失去了它提供的很好的功能,但將一些 ViewState控制(asp:*)與一些經典技術(輸入類型=「...」 )爲我節省了過去頭痛的lot

有時你只想做簡單的事情,簡單的解決方案打敗「所見即所得」的表單編輯。

5

訪問原始郵寄參數你看過CheckBoxList控件嗎?您可以將其綁定到您的數據集,提供文本成員和值成員項目,並且還可以讓您輕鬆查看檢查了哪些項目。如果需要,還可以動態添加更多複選框項目。

2

我所做的一件事是通過AJAX在會話中記錄檢查的狀態,然後在回發(全部或部分通過AJAX)中查看會話中的項目以執行選定的操作。

基本的想法是添加一個onclick處理程序到知道相關項目的ID的複選框。在點擊處理程序中,通過AJAX將此ID傳回服務器並將其記錄在會話中 - 您還需要傳遞複選框狀態,以便您可以取消選中項目。讓提交控制的處理程序使用有關從會話中選擇哪些項目的數據。

這種方式還允許您處理分頁數據,因爲您可以在呈現(全部或部分)呈現帶有選中項的頁面時從會話中設置複選框的初始值。

它可能看起來像這樣。假設ASP.NET AJAX和PageMethods(當然是ScriptManager)。

<script type='text/javascript'> 
    function record(checkbox,item) 
    { 
     var context = { ctl : checkbox }; 
     PageMethods.Record(item,checkbox.checked,onSuccess,onFailure,context); 
    } 

    function onSuccess(result,context) 
    { 
     // do something, maybe highlight the row, maybe nothing 
    } 

    function onFailure(error,context) 
    { 
     context.ctl.checked = false; 
     alert(error.get_Message()); 
    } 
</script> 


... 
<tr><td><input type='checkbox' onclick='record(this,"item_1");'></td><td>Item 1</td></tr> 
... 

Codebehind 

[WebMethod(EnableSessionState=true)] 
public static void Record(string itemName, bool value) 
{ 
    List<string> itemList = (List<string>)Session["Items"]; 
    if (itemList == null) 
    { 
     itemList = new List<string>(); 
     Session["Items"] = itemList; 
    } 
    if (itemList.Contains(itemName) && !value) 
    { 
     itemList.Remove(itemName); 
    } 
    else if (!itemList.Contains(itemName) && value) 
    { 
     itemList.Add(itemName); 
    }  
} 

protected void button_OnClick(object sender, EventArgs e) 
{ 
    List<string> itemList = (List<string>)Session["Items"]; 
    if (itemList != null) 
    { 
     foreach (string item in itemList) 
     { 
      // do something with the selected item 
     } 
    } 
} 
相關問題