Лучший способ привязать данные к списку со связанным с ним контентом (например, вопросы SO с тегами) - PullRequest
1 голос
/ 09 ноября 2008

Используя ASP.net 2.0, как представить информацию пользователю, аналогично списку вопросов в SO, где каждый вопрос имеет несколько дочерних элементов (например, теги).

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

Подход 1:

Тогда я, вероятно, буду использовать вложенные повторители и делать оператор выбора в коде для каждого вложенного повторителя "OnItemDataBind" ...

Подход 2:

Или с двумя наборами данных я бы использовал код C # для создания бизнес-сущности каждого из «Вопросов» и обладал свойством «Теги». Затем я перебрал бы свой набор данных тегов и назначил бы свойство.

Что эффективнее? Есть ли другие альтернативы?

Ответы [ 2 ]

3 голосов
/ 09 ноября 2008

Я бы определенно избежал второго подхода - вы не хотите попадать в базу данных каждый раз, когда вы связываете данные родительского элемента. Как говорит DOK, попытайтесь правильно спроектировать вашу систему. Для меня это означало бы заполнение коллекции бизнес-объектов и привязку к ней. Я делаю что-то похожее с пользовательским элементом управления меню (обратите внимание, что в нем содержатся три списка данных, но вы можете использовать повторители):

На странице aspx:

<asp:DataList ID="dlMenuOne" runat="server" onitemdatabound="dlMenu_ItemDataBound" >
            <ItemTemplate>
             //your object

                <asp:DataList ID="dlMenuTwo"  runat="server" onitemdatabound="dlMenuTwo_ItemDataBound">
                <ItemTemplate>
                //your object's child items

                    <asp:DataList ID="dlMenuThree" runat="server">
                    <ItemTemplate>
                       //child item's child items    
                    </ItemTemplate>
                    </asp:DataList>

                </ItemTemplate>
                </asp:DataList> 

            </ItemTemplate>
            </asp:DataList>

затем в коде:

protected void dlMenu_ItemDataBound(object sender, DataListItemEventArgs e)
{
    DataListItem parentList = e.Item;
    DataList dlMenuTwo = (DataList)parentList.FindControl("dlMenuTwo");
    MenuItem item = (MenuItem)parentList.DataItem;
    dlMenuTwo.DataSource = _menu.GetChildItems(item);
    dlMenuTwo.DataBind();
}

этот метод в основном получает ссылку на привязываемый объект (parentList.DataItem), а затем привязывает вложенный DataList к дочерним элементам (_menu.GetChildItems (item))

1 голос
/ 09 ноября 2008

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

Вместо DataSets вы можете использовать более эффективный DataReader (с двумя наборами результатов). Переберите наборы результатов и заполните объекты Question связанными объектами или свойствами Tag. Поместите эти объекты в ArrayList или общий список, и вы можете привязать его к вашему репитеру.

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

Все эти предложения применимы, только если ваше приложение нетривиально. Использование методов ОО добавляет к коду, но если вы делаете что-то помимо отображения информации, было бы лучше начать с хорошей архитектуры ОО (DAL и BLL, если не MVC).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...