2011-03-22 61 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; } 
} 

这将需要更长的时间上的初始页面视图,但回发时会(理论上)更快,因为它可以得到的列出页面的视图状态而不重建它(基本上反序列化它)。

该方法的缺点是,如果将太多的数据放入浏览器,那么输出到浏览器的视图状态会变得非常大。

相关问题