ASP.NET Web Forms – 导航

ASP.NET Web Forms 中的导航控件与最佳实践(完整详解)

Web Forms 提供了非常强大且开箱即用的导航系统,主要由以下三大控件组成:

控件主要用途数据源控件配合使用
Menu经典桌面式水平/垂直菜单SiteMapDataSource(最常见)
TreeView树形结构(如后台管理菜单)SiteMapDataSource / XmlDataSource
SiteMapPath面包屑导航(当前位置路径)SiteMapDataSource(自动)

1. 最重要文件:Web.sitemap(网站地图)

这是整个导航系统的核心,放在网站根目录。

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="~/Default.aspx" title="首页" description="网站首页">

        <siteMapNode url="~/Products.aspx" title="产品中心" description="所有产品">
            <siteMapNode url="~/Products/Laptop.aspx" title="笔记本电脑" />
            <siteMapNode url="~/Products/Phone.aspx" title="手机" />
        </siteMapNode>

        <siteMapNode url="~/News/" title="新闻动态" description="">
            <siteMapNode url="~/News/List.aspx" title="新闻列表" />
            <siteMapNode url="~/News/Add.aspx" title="发布新闻" roles="Admin" />
        </siteMapNode>

        <siteMapNode url="~/About.aspx" title="关于我们" />
        <siteMapNode url="~/Contact.aspx" title="联系我们" />
        <siteMapNode url="~/Admin/Default.aspx" title="管理后台" roles="Admin,Editor" />

    </siteMapNode>
</siteMap>

重要属性说明:

  • url:页面路径(必须唯一)
  • title:显示的文字
  • description:鼠标悬停提示
  • roles:权限控制(配合 <location>SiteMapProvider 实现权限过滤)

2. 三大导航控件实际使用示例(直接复制到母版页)

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="MyWeb.SiteMaster" %>

<!DOCTYPE html>
<html>
<head runat="server">
    <title></title>
    <asp:ContentPlaceHolder ID="head" runat="server"></asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">

        <!-- 1. 面包屑导航(自动显示当前路径) -->
        <div class="breadcrumb">
            <asp:SiteMapPath ID="SiteMapPath1" runat="server" 
                PathSeparator=" &gt; " 
                CssClass="breadcrumb">
                <CurrentNodeStyle Font-Bold="true" ForeColor="#333" />
                <PathSeparatorStyle ForeColor="#999" />
                <NodeStyle CssClass="crumb-item" />
                <RootNodeStyle Font-Bold="true" />
            </asp:SiteMapPath>
        </div>

        <!-- 2. 水平主菜单(最常用) -->
        <div class="top-menu">
            <asp:Menu ID="NavigationMenu" runat="server" 
                      Orientation="Horizontal"
                      StaticDisplayLevels="2"
                      MaximumDynamicDisplayLevels="4"
                      CssClass="menu"
                      StaticMenuItemStyle-CssClass="menu-item"
                      StaticSelectedStyle-CssClass="menu-selected"
                      StaticHoverStyle-CssClass="menu-hover"
                      DynamicMenuItemStyle-CssClass="dynamic-item"
                      DynamicHoverStyle-CssClass="dynamic-hover">
            </asp:Menu>

            <!-- 自动绑定 Web.sitemap -->
            <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" />
        </div>

        <!-- 3. 垂直侧边栏菜单(常用于二级页面) -->
        <div class="sidebar">
            <asp:TreeView ID="TreeViewMenu" runat="server"
                          ShowLines="true"
                          CssClass="tree"
                          NodeStyle-CssClass="tree-node"
                          SelectedNodeStyle-CssClass="tree-selected"
                          HoverNodeStyle-CssClass="tree-hover">
            </asp:TreeView>
        </div>

        <!-- 主内容区 -->
        <div class="main-content">
            <asp:ContentPlaceHolder ID="MainContent" runat="server" />
        </div>

    </form>
</body>
</html>

3. 代码后台绑定(Site.master.cs)

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        // Menu 和 TreeView 自动绑定 SiteMapDataSource1,无需代码
        // 但如果你想过滤或自定义,可以这样写:

        // 自动根据角色过滤(推荐开启)
        SiteMapDataSource1.SiteMapProvider = "DefaultProvider"; // 默认已启用角色过滤

        // 或者手动绑定(更灵活)
        NavigationMenu.DataSource = SiteMap.RootNode;
        NavigationMenu.DataBind();
    }
}

4. 开启角色权限自动过滤(超级实用)

在 Web.config 中开启:

<system.web>
    <siteMap defaultProvider="DefaultProvider" enabled="true">
        <providers>
            <add name="DefaultProvider" 
                 type="System.Web.XmlSiteMapProvider" 
                 siteMapFile="Web.sitemap" 
                 securityTrimmingEnabled="true" />  <!-- 关键在这里 -->
        </providers>
    </siteMap>

    <!-- 配合角色权限 -->
    <authorization>
        <deny users="?" /> <!-- 所有页面默认拒绝匿名 -->
    </authorization>
</system.web>

<!-- 特定文件夹允许访问 -->
<location path="Admin">
    <system.web>
        <authorization>
            <allow roles="Admin,Editor"/>
            <deny users="*"/>
        </authorization>
    </system.web>
</location>

这样,Web.sitemap 中写了 roles="Admin" 的节点,普通用户就完全看不见!

5. 编程方式跳转(最常用方法)

// 方法1:普通跳转
Response.Redirect("~/Products/Laptop.aspx");

// 方法2:使用 Web.sitemap 中的 url(推荐,路径改了也不用改代码)
Response.Redirect(SiteMap.Provider.FindSiteMapNodeFromKey("laptop").Url);

// 方法3:友好跳转(保留返回地址)
Response.Redirect("~/Login.aspx?ReturnUrl=" + Server.UrlEncode(Request.Url.PathAndQuery));

// 方法4:跨站点跳转
Server.Transfer("~/Error.aspx"); // 服务端跳转,地址栏不变

6. 推荐 CSS 美化(Menu 水平菜单变漂亮)

.menu { background:#333; height:45px; }
.menu-item { 
    float:left; 
    padding:0 20px; 
    line-height:45px; 
    color:#fff;
}
.menu-item a { color:#fff; text-decoration:none; }
.menu-hover { background:#000; }
.menu-selected { background:#c00; font-weight:bold; }

总结:Web Forms 导航最佳组合(99% 项目都这样用)

  1. 根目录放一个 Web.sitemap(维护所有菜单)
  2. 母版页中放 Menu + SiteMapPath + SiteMapDataSource
  3. Web.config 开启 securityTrimmingEnabled=”true”
  4. 使用 Response.Redirect(“~/xxx.aspx”) 或 SiteMap 节点跳转

这样做的好处:

  • 菜单统一维护(只改一个 Web.sitemap)
  • 自动面包屑
  • 自动权限控制
  • 开发效率极高

虽然现在很多人说 Web Forms 过时,但它的导航系统直到今天(2025年)仍然是所有 .NET 技术栈里最省事、最强大的之一!

需要我给你一个完整的可运行示例项目(含后台权限 + 多级菜单)吗?可以直接打包发你~

文章已创建 2965

一个回复在 “ASP.NET Web Forms – 导航

  1. I just couldn’t go away your website before suggesting that I really loved the usual information an individual supply in your visitors?
    Is gonna be again steadily in order to check out new posts

回复 ide777 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部