ASP.NET下拉列表控件可以在回发时保留列表项类吗?

时间:2011-03-22 18:59:32

标签: asp.net css drop-down-menu postback

我在AutoPostBack设置为True的页面上有一个下拉列表控件。在页面的初始加载中,我在DropDownList中的某些ListItem上设置CSS类。生成的HTML如下所示:

<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>

在回发后,下拉列表是否会记住单个ListItem上的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);
}

科里

2 个答案:

答案 0 :(得分: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");
            }
        }
    }

答案 1 :(得分: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; }
}

这在初始页面视图上会花费更长的时间,但在回发期间(理论上)会更快,因为它可以将列表从页面的视图状态中取出而不重构它(基本上反序列化)。

此方法的缺点是,如果您在其中放入太多数据,则输出到浏览器的视图状态会变得非常大。