2011-03-22 66 views
0

我在AutoPostBack設置爲True的頁面上有一個dropdownlist控件。在頁面的初始加載時,我在DropDownList中的某些ListItems上設置了一個CSS類。由此產生的HTML看起來像這樣:ASP.NET dropdownlist控件可以在回發中保留列表項類嗎?

<select id="mySelect"> 
    <option value="1">First</option> 
    <option value="2" selected="selected">Second</option> 
    <option value="3" class="favorite">Third</option> 
    <option value="4">Fourth</option> 
    <option value="5" class="favorite">Fifth</option> 
</select> 

回發後ListItems失去他們的CSS類。它現在看起來像這樣。

<select id="mySelect"> 
    <option value="1">First</option> 
    <option value="2">Second</option> 
    <option value="3">Third</option> 
    <option value="4">Fourth</option> 
    <option value="5" selected="selected">Fifth</option> 
</select> 

是否有任何方式的下拉列表將回傳後記得個別listItems中的CSS類或我將需要以某種方式設置類自己回發後?

以下是將CSS添加到下拉列表中的代碼。它在PageLoad上運行,但不在PostBack上運行。

foreach(MyItem _myItem in MyItemList) 
{ 
    ListItem _listItem = new ListItem(); 
    _listItem.Value = _myItem.ID.ToString(); 
    _listItem.Text = _myItem.Title; 
    if(_myItem.IsFavorite) 
    { 
     _list.Attributes["class"] = "favorite"; 
    } 
    ddlMyDropDown.Items.Add(_listItem); 
} 

科瑞

+0

你是否通過代碼設置了這些類? – CodingGorilla 2011-03-22 19:01:40

+0

是的。我手動創建每個ListItem對象,然後將其添加到DropDownList控件,而不是僅將List綁定到DropDownList。下面 – 2011-03-22 19:10:51

+0

答案是有用 http://stackoverflow.com/questions/1313447/listitems-attributes-in-a-dropdownlist-are-lost-on-postback – 2012-11-23 15:26:30

回答

1

編輯:

這對我的作品。嘗試這樣的事情

protected void Page_Load(object sender, EventArgs e) 
    { 
     if(!IsPostBack) 
     { 
      LoadData(); 
     } 

     LoadStyle(); 
    } 

    private void LoadData() 
    { 
     DropDownList1.Items.AddRange(Enumerable.Range(0, 10).Select(x => new ListItem(x.ToString())).ToArray()); 
    } 

    private void LoadStyle() 
    { 
     foreach (ListItem item in DropDownList1.Items) 
     { 
      if (int.Parse(item.Value) % 2 == 0) 
      { 
       item.Attributes.Add("class", "test"); 
      } 
     } 
    } 
+0

但如果我這樣做,不會我失去了在下拉列表中選擇的項目?我需要手動設置選定的項目嗎? – 2011-03-22 19:15:27

+0

@Corey是否啓用了viewstate? – 2011-03-22 19:19:30

+0

是的,我在頁面上有其他控件按預期工作。他們通過回傳保持價值。實際上,這個dropdownlist在回發之後確實保留了「數據」 - 它只是丟失了CSS類。 – 2011-03-22 19:21:40

0

所以,你的問題就在這裏是國家管理的一個,並且在大多數情況下,是你的責任來管理你的頁面上的項目的狀態。考慮到這一頁可能會在一分鐘內呈現100次(到100個不同的瀏覽器),並且每個頁面可能會有不同的狀態。服務器不能跟蹤所有這些不同的實例和狀態,你必須這樣做。

有兩種方法可以解決這個問題,最簡單的方法類似於@StackOverflowException聲明的內容,只要確定並確定您的狀態您的網頁創建時間。這很容易,但絕對不可擴展,特別是如果涉及大量數據庫工作和其他內容的話。

更好的解決方案是創建自己的一些屬性,將事物存儲在頁面ViewState中。有很多方法可以做到這一點,但這裏只是一個快速的樣品:

protected override OnPageLoad(EventArgs e) 
{ 
    myListBox.Items.AddRange(myListItems); 
} 

protected IEnumberable<ListItems> myListItems 
{ 
    get 
    { 
     IEnumberable<ListItems> items = (IEnumerable<ListItems>)ViewState["myListItems"]; 

     // Build the list if we can't get it out of the viewstate 
     if(items = null) 
     { 
      items = BuildListItems(); 
      ViewState["myListItems"] = items; 
     } 

     return _items;   
    } 

    set { ViewState["myListItems"] = value; } 
} 

這將需要更長的時間上的初始頁面視圖,但回發時會(理論上)更快,因爲它可以得到的列出頁面的視圖狀態而不重建它(基本上反序列化它)。

該方法的缺點是,如果將太多的數據放入瀏覽器,那麼輸出到瀏覽器的視圖狀態會變得非常大。

相關問題