基于SharePoint列表创建侧边菜单的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
相关产品推荐
相关产品推荐

