В классическом ASP я мог отображать разрыв раздела в зависимости от состояния. У меня есть таблица SQL с элементами меню, столбцами: (ListOrder (int), BeginUrl (varchar (20), ShowDate (varchar (20), EndUrl (varchar (20), Section (varchar (20)) BeginURL, ShowDate, EndUrl объединить для создания ссылки Раздел - это состояние (WA, OR, ID). В классическом варианте я создал переменную nLevel, установленную в "", а затем перейду к циклическому просмотру RS.
Do While NOT menuRS.EOF
If menuRS.Fields("Section") <> nLevel Then
Response.Write("<br><br>" & menuRS.Fields("Section"))
nLevel = menuRS.Fields("Section")
End If
If menuRS.Fields("Display") = 0 Then
Response.Write("<br>"& menuRS.Fields("BeginUrl")&menuRS.Fields("ShowDate")&menuRS.Fields("EndUrl")) & VbCrLf
End If
menuRS.MoveNext
Loop
Что даст мне (примерно)
WA
<a href = "stuff">[date]</a>
<a href = "stuff">[date]</a>
OR
<a href = "stuff">[date]</a>
<a href = "stuff">[date]</a>
ID
<a href = "stuff">[date]</a>
Попытка продублировать это в .Net с помощью DataList, ItemTemplate и ASP: Label, конечно же, с использованием VB, дает мне согласие на разрыв «раздела». У меня зацикливаются пункты главного меню. Просто провал на Разрыве Раздела.
<asp:DataList ID = "MenuList1" runat = "server" DataSourceID = "NwccMenuList">
<ItemTemplate>
<asp:Label ID = "SectionBreak" runat = "server"
Text='<%# If(Eval("Section") <> Me.nLevel) Then (Eval("Section") Me.nLevel= Eval("Section") End If%>' />
</ItemTemplate>
<ItemTemplate>
<asp:Label ID = "BeginUrlLabel" runat = "server"
Text='<%# Eval("MenuUrl") %>' />
</ItemTemplate>
</asp:DataList>
<asp:SqlDataSource ID = "NwccMenuList" runat = "server"
ConnectionString = "<%$ ConnectionStrings:nwcctanningConnectionString %>"
SelectCommand = "SELECT ([BeginUrl]+[ShowDate]+[EndUrl]) AS MenuUrl, Section
FROM [Menu] WHERE ([Display] = 0) ORDER BY [Section] DESC, [ListOrder]">
<SelectParameters>
<asp:Parameter DefaultValue = "0" Name = "Display"
Type = "Byte" />
</SelectParameters>
</asp:SqlDataSource>
Не уверен, что переменная nLevel (в файле кода) достижима или не может пройти через оператор If! Я ценю любые указатели или то, где я ошибся!





Как правило, вы хотите заменить один код динозавра другим древним кодом. Хорошо, давайте сделаем это способом ASP.NET. Во-первых, asp:DataList - не лучший выбор, потому что он отображает таблицу. Используйте простейший элемент управления привязкой данных, например asp:Repeater. Это пример кода, который выполняет работу декларативно.
<asp:Repeater ID = "rptMenu" runat = "server" DataSource = "NwccMenuList">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<FooterTemplate></ul></FooterTemplate>
<ItemTemplate>
<li>
<asp:Literal runat = "server" ID = "ltrSection" Text='<%#Eval("Section") %>'></asp:Literal>
<asp:Repeater runat = "server" DataSource = "sqlSubmenu">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<FooterTemplate></ul></FooterTemplate>
<ItemTemplate>
<li>
<asp:HyperLink runat = "server" Text='<%#Eval("MenuUrl") %>' NavigateUrl='<%#Eval("MenuUrl") %>'></asp:HyperLink>
</li>
</ItemTemplate>
</asp:Repeater>
<%-- Note that a child datasource is inside parent ItemTemplate --%>
<asp:SqlDataSource ID = "sqlSubmenu" runat = "server"
ConnectionString = "<%$ ConnectionStrings:nwcctanningConnectionString %>"
SelectCommand = "SELECT ([BeginUrl]+[ShowDate]+[EndUrl]) AS MenuUrl
FROM [Menu] WHERE ([Display] = 0 and Section=@section) ORDER BY [ListOrder]">
<SelectParameters>
<%-- literal control from parent ItemTemplate --%>
<asp:ControlParameter ControlID = "ltrSection" Name = "section" Type = "String" />
</SelectParameters>
</asp:SqlDataSource>
</li>
</ItemTemplate>
</asp:Repeater>
<asp:SqlDataSource ID = "NwccMenuList" runat = "server"
ConnectionString = "<%$ ConnectionStrings:nwcctanningConnectionString %>"
SelectCommand = "SELECT distinct Section FROM [Menu] WHERE ([Display] = 0) ORDER BY [Section] DESC">
<SelectParameters>
<asp:Parameter DefaultValue = "0" Name = "Display"
Type = "Byte" />
</SelectParameters>
</asp:SqlDataSource>
Опять же, этому подходу более 10 лет.
Там была пара ошибок, убрал их. Я ценю вашу помощь. Пришлось превратить asp: Literal в asp: Label (для PropertyName должно быть установлено допустимое имя свойства элемента управления с именем ltrSection в ControlParameter «Section») и пришлось объявить идентификатор в полях DataSource в репитерах. Еще раз ценю вашу помощь!
asp:Literal не отображает разметку HTML. PropertyName = "Text". Обычно это не требуется. Как правило, ASP.NET теперь считается устаревшим, если не устаревшим. Я удивлен, что вы перемещаете одну старую (доисторическую) платформу на другую старую платформу. MVC и ASP Core сегодня более популярны.
Вам понадобится Repeater и много дополнительного кода в событии ItemDataBound или настраиваемое средство визуализации, чтобы сделать это с помощью WebForms.