我在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);
}
科里
答案 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; }
}
这在初始页面视图上会花费更长的时间,但在回发期间(理论上)会更快,因为它可以将列表从页面的视图状态中取出而不重构它(基本上反序列化)。
此方法的缺点是,如果您在其中放入太多数据,则输出到浏览器的视图状态会变得非常大。