【问题标题】:Can ASP.NET dropdownlist control persist list item classes on postback?ASP.NET 下拉列表控件可以在回发时保留列表项类吗?
【发布时间】:2011-03-22 18:59:32
【问题描述】:

我在 AutoPostBack 设置为 True 的页面上有一个下拉列表控件。在页面的初始加载中,我在 DropDownList 中的某些 ListItems 上设置了一个 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>

有什么方法可以让下拉列表在回发后记住单个 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);
}

科里

【问题讨论】:

  • 您是否通过某种方式通过代码设置这些类?
  • 是的。我手动创建每个 ListItem 对象,然后将其添加到 DropDownList 控件,而不是仅仅将 List 绑定到 DropDownList。
  • 下面的回答很有用stackoverflow.com/questions/1313447/…

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


【解决方案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");
            }
        }
    }

【讨论】:

  • 但是如果我这样做不会丢失下拉列表中的选定项目吗?我必须手动设置所选项目吗?
  • @Corey 是否启用了视图状态?
  • 是的,我在页面上还有其他按预期工作的控件。他们通过回发保持自己的价值观。事实上,这个下拉列表在回发后确实保留了“数据”——它只是丢失了 CSS 类。
  • 分开添加项目和添加css。由于视图状态,数据在回发之间保持不变,但 css 不会。因此您只需添加一次项目,但在每次回发时添加 css。
【解决方案2】:

因此,您的问题是状态管理之一,在很大程度上,您有责任管理页面上项目的状态。考虑到这一页可能在一分钟内呈现 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; }
}

这在初始页面视图上会花费更长的时间,但在回发期间(理论上)会更快,因为它可以使列表脱离页面的视图状态而无需重建它(基本上是反序列化它)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多