SharePoint母版页里自带了一个顶部链接导航栏,我们可以在设置页面配置这个导航栏的内容,但如果你想要从某些配置(比如XML或者SharePoint List)来读取数据并呈现在这个导航栏里的话,就需要一些开发工作,让我们来看看需要做哪些事情。

打开母版页,可以找到如下用来表示顶部链接的标记:

<SharePoint:AspMenuID="TopNavigationMenuV4"Runat="server"EnableViewState="false"DataSourceID="topSiteMap"AccessKey="<%$Resources:wss,navigation_accesskey%>"UseSimpleRendering="true"UseSeparateCss="false"Orientation="Horizontal"StaticDisplayLevels="2"MaximumDynamicDisplayLevels="5"SkipLinkText=""CssClass="s4-tn"/><SharePoint:DelegateControl runat="server" ControlId="TopNavigationDataSource" Id="topNavigationDelegate"><Template_Controls><asp:SiteMapDataSourceShowStartingNode="False"SiteMapProvider="SPNavigationProvider"id="topSiteMap"runat="server"StartingNodeUrl="sid:1002"/></Template_Controls></SharePoint:DelegateControl>

可以看出顶部链接是一个AspMenu控件,它的DataSourceID是topSiteMap,是一个SiteMapDataSource控件,好在这个控件被包含到一个DelegateControl里,所以我们只需要开发一个ID同样为topNavigationDelegate的DelegateControl,就可以达到替换数据源的效果。

AspMenu需要层级结构的数据源,所以我们先来写一个表示菜单项分层集合类:

public class MenuHierarchicalEnumerable : ArrayList, IHierarchicalEnumerable{public MenuHierarchicalEnumerable() : base() { }public IHierarchyData GetHierarchyData(object enumeratedItem){return enumeratedItem as IHierarchyData;}}

然后实现表示菜单项的实体类,这个类需要实现IHierarchyData和INavigateUIData两个接口:
public class Menu : IHierarchyData, INavigateUIData{public string Name { get; set; }public string NavigateUrl { get; set; }public string Description { get { return Name; } }public string Value { get { return NavigateUrl; } }public object Item { get { return this; } }public string Path { get { return NavigateUrl; } }public string Type { get { return typeof(Menu).FullName; } }public Menu[] SubMenus { get; set; }public bool HasChildren{get { return SubMenus != null && SubMenus.Length > 0; }}public IHierarchicalEnumerable GetChildren(){var children = new MenuHierarchicalEnumerable();if (this.HasChildren){children.AddRange(this.SubMenus);}return children;}public IHierarchyData GetParent(){return null;}}

实现INavigateUIData接口的目的是让AspMenu将数据正确识别为链接,在实现这个接口的时候,要注意它的所有属性都必须不能为空,否则会抛出异常。

接着是一个分层数据源的视图类,我们需要重写它的Select方法,并返回分层菜单项集合。这里我丑陋的硬编码了菜单项集合,在实际工作中,可以从XML或者SharePoint List等位置读取数据:

public class MenuDataSourceView : HierarchicalDataSourceView{public MenuDataSourceView(string viewPath) { }public override IHierarchicalEnumerable Select(){var rootMenu = Enumerable.Range(1, 10).Select(i => new Menu(){Name = "Menu 1." + i.ToString(),NavigateUrl = "#"}).ToArray();foreach (var menu in rootMenu){menu.SubMenus = Enumerable.Range(1, 5).Select(i => new Menu(){Name = "Menu 2." + i.ToString(),NavigateUrl = "#"}).ToArray();foreach (var subMenu in menu.SubMenus){subMenu.SubMenus = Enumerable.Range(1, 3).Select(i => new Menu(){Name = "Menu 3." + i.ToString(),NavigateUrl = "#"}).ToArray();}}var result = new MenuHierarchicalEnumerable();result.AddRange(rootMenu);return result;}}

我硬编码了一组菜单项,顶级菜单10个,每个下面有5个二级菜单,而每个二级菜单下面又有3个三级菜单。

最后是真正的数据源控件:

public class MenuDataSource : HierarchicalDataSourceControl{public MenuDataSource() : base() { }protected override HierarchicalDataSourceView GetHierarchicalView(string viewPath){return new MenuDataSourceView(viewPath);}}

到此,代码开发完毕,下面是部署这些代码所需要的工作。

首先添加一个名为“MenuDataSourceDelegateControl”的自定义模块,删掉自动生成的Sample.txt,将Elements.xml修改如下的内容:

<?xml version="1.0" encoding="utf-8"?><Elements xmlns="<a href="http://schemas.microsoft.com/sharepoint/&quot;">http://schemas.microsoft.com/sharepoint/"</a>><Control Id="TopNavigationDataSource"ControlAssembly="VisualWebPartDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=496e7a1c31c1f5a3"ControlClass="WindStyle.Demo.MenuDataSource"><Property Name="ID">topSiteMap</Property></Control></Elements>

这段XML表示,在Feature激活之后,会用指定的程序集和类来创建一个MenuDataSource控件,并将它的ID设置为topSiteMap(既AspMenu的DataSourceID),然后用这个控件来替代母版页中名为TopNavigationDataSource的DelegateControl,那么AspMenu的数据源也就相当于被替换了。

到这一步还没有完全结束,因为MenuDataSource是一个控件,我们需要将它标识为安全控件才能够在SharePoint中使用。

右键单击刚才创建的MenuDataSourceDelegateControl模块,查看其属性,点击“安全控制项”(又一个烂翻译)旁边的省略号按钮。点击“添加”并依下图配置安全控件:

接下来将这个模块添加到合适的Feature里,部署吧。

看起来似乎有些诡异,其实这是因为AspMenu控件的默认设置导致的,在本文开头的标记中你可以看到,AspMenu的StaticDisplayLevels属性默认值为2,也就是说它会显示两层静态菜单。通常我们只希望显示一层顶级菜单,那么可以用SharePoint Designer将这个值修改为1。

修改后的效果如下:

本文介绍的方法是用来修改SharePoint母版页中默认包含的顶部链接导航栏的数据源的,但如果你有特殊的需求需要单独写一个导航菜单,也可以使用AspMenu,毕竟可以避免许多前端JavaScript和Css方面的工作,而数据源部分,可以用本文提到的方法稍作变通(可以不需要DelegateControl了)。

为SharePoint顶部链接开发自定义数据源相关推荐

  1. SharePoint 2013 图文开发系列之自定义字段

    原文:SharePoint 2013 图文开发系列之自定义字段 SharePoint使用的优势,就在于开箱即用.快速搭建,SharePoint自身为我们提供了很多字段类型,已经很丰富了.但是,在实际应 ...

  2. 使用SharePoint Designer定制开发专家库系统实例!

    将近大半年都没有更新博客了,趁这段时间不忙,后续会继续分享一些技术和实际应用.对于Sharepoint的定制开发有很多种方式,对于一般的应用系统,可以使用Sharepoint本身自带的功能,如列表作为 ...

  3. SharePoint使用BCS开发你第一个应用程序(三)

    SharePoint使用BCS开发你第一个应用程序(三) 创建外部内容类型. 创建外部内容类型有三种不同方式: 1. 在记事本上手写XML代码(不推荐). 2. 使用SharePoint Design ...

  4. SharePoint 2013常用开发工具分享

    众所周知,一款好的开发工具不仅能提高项目开发效率,而且能够协助开发人员简化开发流程.本文汇总几款SharePoint 2013开发常用开发工具,希望能够对大家有所帮助.如果您有更好的工具,没有包含在本 ...

  5. 如何为Apache Kylin快速开发新数据源?

    2019独角兽企业重金招聘Python工程师标准>>> 在近期的Apache Kylin Innovation Meetup 上,Kyligence的技术合伙人兼生态合作技术总监李栋 ...

  6. java自定义菜单跳转页面_微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解...

    微信公众号开发 自定义菜单 请先读完本文再进行配置开发 请先前往微信平台开发者文档阅读"网页授权获取用户基本信息"的接口说明 在微信公众账号开发中,往往有定义一个菜单,然后用户点击 ...

  7. SharePoint 2010: 对于开发人员

    对开发人员的价值 SharePoint 2010为开发人员提供的好处是什么? 开发人员可以使用 SharePoint 2010 开发平台为企业和 互联网构建商业协作应用,并且使用熟悉的工具和一套丰富的 ...

  8. SharePoint 调查列表的自定义错误页面

    场景: 使用SharePoint的调查列表做调查问卷的时候,我们经常要设置成不允许多次答复,这样的话每个人就只能答复一次. 问题: 可是这样会产生一个问题,就是如果一个人第二次答复的话,那么出现的错误 ...

  9. 国内首部Sharepoint 2010深入开发(工作流+安全性+单点登录+AD开发、认证等)

    简介:本课程是国内首部深入讲解Sharepoint 2010全程开发的课程,讲师为微软中国上海公司高级工程师.课程采用技术结合实例的方式讲解,涉及内容包括Sharepoint2010之Linq.WCF ...

最新文章

  1. [转] WinForm实现移除控件某个事件的方法
  2. mysql怎么删除唯一索引_mysql删除唯一索引
  3. GNS3从入门到精通
  4. 兼容所有浏览器的网页制作方法
  5. Direct HTTP Tunnel(直接HTTP客户端)
  6. vs2019 发行说明_如何计算发行说明
  7. 从Unreal Engine 3到Unreal Engine 4
  8. redis 管理工具_「程序猿同事的分享」redis cluster管理工具redis-trib.rb详解
  9. 实战 SQL!金融机构可疑支付交易的监测 | 原力计划
  10. 【原创】大叔经验分享(26)hive通过外部表读写elasticsearch数据
  11. RHCE 学习笔记(32) - DNS
  12. Android app修改IMEI号
  13. 系统分析与设计-(二)系统规划
  14. 推荐给你三个知识星球助你选对人生
  15. Hexo-NexT主题添加评论功能(来必力、Hypercomments、畅言、友言)
  16. java 匹配任意字符_正则表达式匹配任意字符(包括换行符)
  17. html页面不能放大缩小,互联网常识:html怎么禁止页面放大缩小
  18. 5月6日地图下载。同学们要练习!
  19. response.setHeader()方法设置http文件头的值
  20. 18位身份证号编码规则最后一位

热门文章

  1. 大脑如何判断该睡觉了?可能是这80种蛋白说了算
  2. 浙江将建设超级高速公路,全面支持自动驾驶
  3. 德国图宾根大学发布可扩展「对抗黑盒攻击」,仅通过观察决策即可愚弄深度神经网络
  4. 倒计时|全场书籍低至 3.5 折起,无门槛包邮!
  5. 壕!阿里开工红包惊人,最高 1000 万,有人却只收到一杯白开水
  6. 秒抢红包的背后,是复杂的即时付款系统
  7. 汉芯一号、木兰语言再到天赐 OS,国产基础软件十年泣血,梦想何圆?
  8. Flask框架从入门到精通之转换器(四)
  9. 关于图片上传的个人摘要
  10. 手机密钥连接linux主机