SharePoint开发 - 自定义导航菜单(一)菜单声明与配置

本篇描述自定义sharepoint菜单的一种方式,自定义菜单适用于一些门户等需求的网站

自定义的菜单有自己的数据源,可以是数据表,可以是XML,本篇叙述的是采用XML数据源作为菜单的声明定义部分,将XML以文件的格式保存到网站中自己创建的配置文档库中

XML菜单的格式形如下面的格式,其中有菜单标题title属性,有菜单所属的权限用户组SPGroups属性,有菜单的链接url属性,实际应用中可以添加更多的字段。

<SiteMap>
  <SiteMapNode title="我的项目" SPGroups="质量技术中心;造价中心;分公司;第3分公司;工程部;资金中心;核算中心;运营中心;内审中心;财务中心;核算中心;测试组;资金组" >
<SiteMapNode title="项目管理" url="/_layouts/SP_MIP/PI/PI_BasicInfoSearchInfo.aspx" SPGroups="质量技术中心;资金中心;核算中心;造价中心;财务中心;分公司;第3分公司;工程部;运营中心;内审中心;核算中心;测试组;资金组"/>
  </SiteMapNode>
</SiteMap>

我们要给网站管理员提供一个接口来定义导航菜单,比如放到网站设置里,如图所示

新建一个SharePoint解决方案,添加一个元素Element用来定义这个网站设置菜单(CustomActionGroup和CustomAction节点)。代码如下(这里包含我后期添加的一个用户修改密码的功能,这里不做说明)

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <CustomActionGroup
     Id="SPMIPNavigation"
     Title="SPMIP导航"
     Description = "SPMIP导航"
     Location = "Microsoft.SharePoint.SiteSettings"
     Sequence = "1999"
     ImageUrl="/_layouts/Images/SiteSettings_SPMIPNavigation_48x48.png">
  </CustomActionGroup>
  <CustomAction
    Id="SPMIPTopNav"
    GroupId="SPMIPNavigation"
    Location="Microsoft.SharePoint.SiteSettings"
    Rights="ManageWeb"
    Sequence="2000"
    Title="顶部导航"
    Description="顶部导航">
    <UrlAction Url="{SiteUrl}/_layouts/SP_MIP/TopNav.aspx" />
  </CustomAction>
  <CustomAction
    Id="SPMIPLeftNav"
    GroupId="SPMIPNavigation"
    Location="Microsoft.SharePoint.SiteSettings"
    Rights="ManageWeb"
    Sequence="2010"
    Title="左侧导航"
    Description="左侧导航">
    <UrlAction Url="{SiteUrl}/_layouts/SP_MIP/LeftNav.aspx" />
  </CustomAction>
  <CustomAction
    Id="SPMIPChangePassword"
    GroupId="PersonalActions"
    Location="Microsoft.SharePoint.StandardMenu"
    Sequence="1000"
    Title="修改密码"
    Description="修改密码"
    ImageUrl="{SiteUrl}/_layouts/images/Welcome_SPMIPChangePwd_32x32.png">
    <UrlAction Url="javascript:Show();"/>
  </CustomAction>
</Elements>

添加相应的网站资产,如设置图片。添加两个页面TopNav.aspx和LeftNav.aspx。两个页面其实没什么区别,以TopNav为例,添加一个多行文本框,一个保存按钮就可以了。

核心页面代码

<table border="0" width="100%" cellspacing="0" cellpadding="0">
        <wssuc:InputFormSection ID="InputFormSection" Title="顶部导航" runat="server" Description="顶部导航">
            <Template_InputFormControls>
                <wssuc:InputFormControl ID="InputFormControl" runat="server">
                    <Template_Control>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tr>
                                <td align="right" style="padding-bottom: 5px">
                                    <a href="javascript:topnav_showFullScreen('<%= txtNavXml.ClientID %>', '<%= txtNavXmlPop.ClientID %>');"
                                        style="color: #0072bc;">
                                        <asp:Literal ID="ltl" runat="server" Text="全屏编辑" />
                                    </a>
                                </td>
                            </tr>
                            <tr>
                                <td>
                                    <asp:TextBox ID="txtNavXml" runat="server" Wrap="false" TextMode="MultiLine" Rows="22"
                                        Width="600px" />
                                </td>
                            </tr>
                        </table>
                    </Template_Control>
                </wssuc:InputFormControl>
            </Template_InputFormControls>
        </wssuc:InputFormSection>
        <wssuc:ButtonSection ID="bts" runat="server" ShowStandardCancelButton="false">
            <Template_Buttons>
                <asp:Button runat="server" class="ms-ButtonHeightWidth" Text="保存" ID="btnSave" OnClick="btnSave_OnClick" />
                <asp:Button runat="server" class="ms-ButtonHeightWidth" Text="取消" ID="btnClose" OnClientClick="TopNav_Close_Click(); return false;" />
            </Template_Buttons>
        </wssuc:ButtonSection>
    </table>
    <table id="tblFullScreen" border="0" cellpadding="0" cellspacing="0" class="tblPop">
        <tr>
            <td align="center" valign="top">
                <table border="0" cellpadding="5" cellspacing="0" width="100%">
                    <tr>
                        <td>
                            <asp:TextBox ID="txtNavXmlPop" runat="server" Wrap="false" TextMode="MultiLine" Rows="28"
                                Width="99%" />
                        </td>
                    </tr>
                    <tr>
                        <td align="center">
                            <a href="javascript:topnav_hideFullScreen('<%= txtNavXml.ClientID %>', '<%= txtNavXmlPop.ClientID %>');"
                                style="color: #0072bc;">
                                <asp:Literal ID="ltlClose" runat="server" Text="关闭" />
                            </a>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>

按钮后台的处理事件要做的事情就是把XML配置文件的内容读取出来,并把用户更改的XML定义保存回文档库的XML文件中。

protected void btnSave_OnClick(object sender, EventArgs e)
        {
            try
            {
                Config.Save(base.Web, this.txtNavXml.Text, Config.NavType.Top);
                SPUtility.Redirect("settings.aspx", SPRedirectFlags.RelativeToLayoutsPage, HttpContext.Current);
            }
            catch (Exception exception)
            {
                SPMIPTrace.WriteError("SPMIPNavigation", exception);
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!base.IsPostBack)
            {
                this.txtNavXml.Text = Config.Load(base.Web, Config.NavType.Top);
            }
        }
 class Config
    {
        public static string Load(SPWeb web, NavType navType)
        {
            string str = null;
            try
            {
                StreamReader reader;
                SPList settingList = SPMIPUtility.CheckSettingList("SPMIPSetting");
                switch (navType)
                {
                    case NavType.Top:
                        {
                            SPFile topNavSettingFile = settingList.RootFolder.Files["TopNav.xml"];
                            if (topNavSettingFile.Exists)
                            {
                                using (reader = new StreamReader(topNavSettingFile.OpenBinaryStream()))
                                {
                                    str = reader.ReadToEnd();
                                }
                            }
                            break;
                        }
                    case NavType.Left:
                        {
                            SPFile leftNavSettingFile = settingList.RootFolder.Files["LeftNav.xml"];
                            if (leftNavSettingFile.Exists)
                            {
                                using (reader = new StreamReader(leftNavSettingFile.OpenBinaryStream()))
                                {
                                    str = reader.ReadToEnd();
                                }
                            }
                            break;
                        }
                }
                return str;
            }
            catch (Exception exception)
            {
                SPMIPTrace.WriteError("SPMIPNavigation", exception);
                return str;
            }
        }

        public static bool Save(SPWeb web, string fileContent, NavType navType)
        {
            bool flag = false;
            try
            {
                SPList settingList = SPMIPUtility.CheckSettingList("SPMIPSetting");
                byte[] bytes = Encoding.UTF8.GetBytes(fileContent);
                web.AllowUnsafeUpdates = true;
                switch (navType)
                {
                    case NavType.Top:
                        settingList.RootFolder.Files.Add("TopNav.xml", bytes, true);
                        break;
                    case NavType.Left:
                        settingList.RootFolder.Files.Add("LeftNav.xml", bytes, true);
                        break;
                }
                flag = true;
            }
            catch (Exception exception)
            {
                SPMIPTrace.WriteError("SPMIPNavigation", exception);
            }
            return flag;
        }

        public enum NavType
        {
            Top,
            Left
        }
    }

大致的功能就完成了,下一讲叙述如何在母版页应用这个菜单声明。

时间: 2024-11-07 16:56:14

SharePoint开发 - 自定义导航菜单(一)菜单声明与配置的相关文章

SharePoint开发 - 自定义导航菜单(二)母版页的菜单应用

接上篇点击打开链接 本篇叙述在母版页中应用之前的配置信息生成菜单,主要涉及到母版页的自定义,并应用了第三方控件库DevExpress,感兴趣的可以看看,这套东西很强大,戳这里 新建一个SharePoint项目,添加一个模块Module.Module会自动附带一个sample.txt的文件和一个Elements.xml的定义文件.我们删除掉没用的sample.txt,修改Elements.xml为如下所示 <?xml version="1.0" encoding="utf

SharePoint开发 - 自定义导航菜单(三)附其他代码

接上篇点击打开链接 LeftNavGroupTemplate.cs internal class LeftNavGroupTemplate : ITemplate { // Fields private int index; private string xml; // Methods public LeftNavGroupTemplate(string _navXml, int _groupIndex) { this.xml = _navXml; this.index = _groupInde

SharePoint开发 - 自定义页面(错误页、登出页)

本文叙述如何自定义SharePoint的固有页面,比较简单,用一句话说就是“做个页面,写一句代码.” 创建SharePoint空解决方案,添加Layouts映射文件夹,添加页面文件error.aspx和signout.aspx. error.aspx [html] view plaincopyprint? <%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %> <%@ Import Namespace=

SharePoint 2013:自定义ECB菜单项的添加

本文分别介绍了两种常用的添加ECB菜单项的方式. 声明式创建 这也是微软最佳实践推荐的方式.在VS中创建一个SharePoint空解决方案,并添加一个“空元素”类型的SPI. 在Elements.xml中,定义一个CustomAction,重点关注一下其中高亮部分的属性(本例在文档内容类型的项上添加了一个菜单项,点击导航到一个自定义应用程序页面,并传递项所在的列表的Id作为参数): 添加到Feature,并部署.效果如下: 服务器对象模型创建 这里会用到Feature的事件处理程序.本例同时还演

每日学习心得:SharePoint 2013 自定义列表项添加Callout菜单项、文档关注、SharePoint服务端对象模型查询

前言: 前一段时间一直都比较忙,没有什么时间进行总结,刚好节前项目上线,同时趁着放假可以好好的对之前遇到的一些问题进行总结.主要内容有使用SharePoint服务端对象模型进行查询.为SharePoint 自定义列表项添加callout菜单.希望能够给大家带来一些帮助. 1.  在aspx页引用可视化Web部件 有时候会需要在页面中引用项目中创建的可视化Web部件,具体步骤有以下这几步: 1) 在aspx页面顶部注册该可视化Web部件 示例如下: <%@ Register Tagprefix=&qu

SharePoint 2013 自定义扩展菜单

原文:SharePoint 2013 自定义扩展菜单 在对SharePoint进行开发或者功能扩展的时候,经常需要对一些默认的菜单进行扩展,以使我们开发的东西更适合SharePoint本身的样式.SharePoint的各种功能菜单,像网站设置.Ribbon.列表里的下拉等等,都是一样原理的,都是XML+JS脚本实现的,如果想实现这些功能,只需要一个XML发布成Feature,并在网站功能启用,即可. 其实,关于这个并没有什么过多可以说的东西,大家在实践中,渐渐理解了.下面,我就举几个简单的例子,

SharePoint 2013 自定义扩展菜单(二)

原文:SharePoint 2013 自定义扩展菜单(二) 接博文<SharePoint 2013 自定义扩展菜单>,多加了几个例子,方便大家理解. 例七 列表设置菜单扩展(listedit.aspx) 扩展效果 XML描述 <CustomAction Id="CustomAction1" Description="博客园-霖雨" Title="博客园-霖雨" GroupId="GeneralSettings"

微信公众帐号开发-自定义菜单的创建及菜单事件响应

注:文章代码来源于柳峰的微信公众平台应用开发 微信开发公众平台自定义菜单需要花钱认证才能实现,不想花钱只能玩测试账号了,不过这并不影响开发.我的开发都是基于柳峰老师的微信公众平台应用开发做的. 只要我们使用公众平台测试账号就可以开发自定义菜单了,比较方便,测试账号开放了很多接口,很方便. 在开发自定义菜单的时候可以参考微信公众平台开发者文档的自定义菜单创建. 一.自定义菜单 1.自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单. 2.一级菜单最多4个汉字,二级菜单最多7个汉字,多

Android界面编程——导航栏及菜单(六)

Android界面编程--导航栏及菜单 2.7导航栏及菜单 2.7.1  ActionBar ActionBar是Android3.0(API 11)开始增加的新特性,ActionBar出现在活动窗口的顶部,可以显示标题.icon.Actions按钮.可交互View,可实现应用程序级的导航,如图2.7-1所示 图2.7-1 其中 1. App icon: 主要用于展示App的Logo,如果当前界面不是一级界面,还可以展示返回航. 2.View Control: 用于切换不同的视图或者展示非交互信