Может ли элемент управления выпадающего списка ASP.NET сохранять классы элементов списка при обратной передаче? - PullRequest
0 голосов
/ 22 марта 2011

У меня есть элемент управления раскрывающегося списка на странице с AutoPostBack, установленным в True. При начальной загрузке страницы я устанавливаю класс CSS для определенных ListItems в DropDownList. Результирующий 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>

Есть ли способ, что выпадающий список будет помнить классы CSS на отдельных элементах ListItems после обратной передачи, или мне нужно будет каким-то образом самому устанавливать классы после обратной передачи?

Вот код, который добавляет 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);
}

Corey

Ответы [ 2 ]

1 голос
/ 22 марта 2011

РЕДАКТИРОВАТЬ:

Это работает для меня.Попробуйте что-то вроде этого

    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 голосов
/ 22 марта 2011

Итак, ваша проблема здесь связана с управлением состоянием, и по большей части вы несете ответственность за управление состоянием элементов на вашей странице. Учтите, что эта страница может отображаться 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; }
}

Это займет немного больше времени при начальном просмотре страницы, но во время обратной передачи (теоретически) будет быстрее, потому что он может вывести список из состояния просмотра страницы, не восстанавливая его (в основном десериализовав его).

Недостатком этого метода является то, что ваше состояние просмотра, которое выводится в браузер, может стать очень большим, если вы поместите в него слишком много данных.

...