You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于SharePoint列表创建侧边菜单的Visual Web Part实现方法问询

实现基于SharePoint List的动态侧边导航Visual Web Part

1. 创建Visual Web Part项目

  • 打开Visual Studio,新建SharePoint 201x 项目,选择Visual Web Part模板
  • 填写项目名称,指定部署目标的SharePoint站点(本地调试站点),选择“部署为场解决方案”

2. 编写后台C#核心逻辑

在WebPart的代码文件中,引入必要命名空间并实现列表数据读取、权限过滤与排序逻辑:

using Microsoft.SharePoint;
using System.Collections.Generic;
using System.Web.UI.WebControls;

namespace YourProjectNamespace
{
    public class MenuItem
    {
        public string Title { get; set; }
        public string Url { get; set; }
        public int Order { get; set; }
    }

    public partial class DynamicSideMenu : WebPart
    {
        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            using (SPWeb web = SPContext.Current.Web)
            {
                // 替换为你的菜单列表名称
                SPList menuList = web.Lists.TryGetList("侧边菜单列表");
                if (menuList == null)
                {
                    Controls.Add(new LiteralControl("<p>菜单列表不存在</p>"));
                    return;
                }

                SPUser currentUser = web.CurrentUser;
                List<MenuItem> validMenuItems = new List<MenuItem>();

                // 按order字段升序查询列表项
                SPQuery query = new SPQuery();
                query.Query = "<OrderBy><FieldRef Name='order' Ascending='True' /></OrderBy>";

                foreach (SPListItem item in menuList.GetItems(query))
                {
                    bool isVisible = false;
                    // 处理Visible to字段(需与列表字段内部名称一致,若显示名是Visible to,内部名可能为VisibleTo)
                    SPFieldUserValueCollection visibleUsers = item["Visible to"] as SPFieldUserValueCollection;

                    // 字段为空则所有人可见
                    if (visibleUsers == null || visibleUsers.Count == 0)
                    {
                        isVisible = true;
                    }
                    else
                    {
                        // 检查当前用户是否在可见列表中
                        foreach (SPFieldUserValue userVal in visibleUsers)
                        {
                            if (userVal.User.ID == currentUser.ID)
                            {
                                isVisible = true;
                                break;
                            }
                        }
                    }

                    if (isVisible)
                    {
                        MenuItem menuItem = new MenuItem
                        {
                            Title = item["Title"]?.ToString() ?? string.Empty,
                            Url = item["url"]?.ToString() ?? string.Empty,
                            Order = int.TryParse(item["order"]?.ToString(), out int ord) ? ord : 0
                        };

                        // 转换相对路径为绝对路径
                        if (!string.IsNullOrEmpty(menuItem.Url) && !menuItem.Url.StartsWith("http"))
                        {
                            menuItem.Url = web.Site.MakeFullUrl(menuItem.Url);
                        }

                        validMenuItems.Add(menuItem);
                    }
                }

                rptMenu.DataSource = validMenuItems;
                rptMenu.DataBind();
            }
        }
    }
}

3. 编写前端ASCX页面

在Visual Web Part的ASCX文件中,添加Repeater控件渲染菜单,并添加基础样式:

<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DynamicSideMenu.ascx.cs" Inherits="YourProjectNamespace.DynamicSideMenu" %>

<div class="sidebar-menu">
    <ul>
        <asp:Repeater ID="rptMenu" runat="server">
            <ItemTemplate>
                <li>
                    <a href='<%# Eval("Url") %>' target="_self"><%# Eval("Title") %></a>
                </li>
            </ItemTemplate>
        </asp:Repeater>
    </ul>
</div>

<style>
    .sidebar-menu ul {
        list-style: none;
        padding: 8px 0;
        margin: 0;
    }
    .sidebar-menu li {
        margin: 4px 0;
    }
    .sidebar-menu a {
        display: block;
        padding: 6px 12px;
        color: #212121;
        text-decoration: none;
        border-radius: 4px;
        transition: background 0.2s;
    }
    .sidebar-menu a:hover {
        background-color: #f5f5f5;
    }
</style>

4. 部署与测试

  • 右键项目选择部署,将WebPart发布到目标SharePoint站点
  • 打开站点页面,进入编辑模式,将该Visual Web Part添加到侧边栏区域
  • 向菜单列表中添加测试项,设置Title、Url、Order和Visible to字段,刷新页面验证菜单显示、权限过滤、排序是否正常

关键注意事项

  • 字段内部名称:代码中使用的字段名需与列表字段的内部名称完全一致,可通过列表字段编辑页面的地址栏Field=参数查看
  • 权限配置:确保当前用户拥有菜单列表的读取权限,否则无法获取数据
  • URL兼容性:若Url字段填写站点相对路径,代码会自动转换为绝对路径,避免跨站点导航错误

内容的提问来源于stack exchange,提问作者Arpit Pathak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:52:21