首页 > 解决方案 > asp.net ASP.DataList vb.net 中的 if 语句

问题描述

在经典 ASP 中,我能够显示基于状态的分节符。我有一个带有菜单项的 SQL 表,列:(ListOrder(int),BeginUrl(varchar(20),ShowDate(varchar(20),EndUrl(varchar(20),Section(varchar(20))) BeginURL,ShowDate,EndUrl连接以创建链接。部分是状态(WA,OR,ID)。在经典中,我创建了一个 var 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>

尝试使用 DataList、ItemTemplate 和 ASP:Label 在 .Net 中复制它,当然是使用 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.netvb.net

解决方案


通常,您想用另一个古代代码替换一个恐龙代码。好的,让我们以 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 多年的历史。


推荐阅读