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 = _groupIndex;
        }

        public void InstantiateIn(Control container)
        {
            HtmlGenericControl child = new HtmlGenericControl("div");
            child.Style["width"] = "150px";
            child.Style["overflow"] = "hidden";
            DevExpress.Web.ASPxTreeView.ASPxTreeView view = new DevExpress.Web.ASPxTreeView.ASPxTreeView
            {
                ID = "tv" + this.index
            };
            view.Font.Name = "微软雅黑";
            view.Font.Size = new FontUnit("12px");
            view.TextField = "title";
            view.ToolTipField = "title";
            view.NavigateUrlField = "url";
            view.ImageUrlField = "imgurl";
            view.Width = new Unit("100%");
            XmlDataSource source = new XmlDataSource
            {
                ID = Guid.NewGuid().ToString(),
                Data = this.xml
            };
            source.XPath = "/SiteMap/SiteMapNode[" + ((this.index + 1)).ToString() + "]/*";
            view.DataSource = source;
            view.DataBind();
            child.Controls.Add(view);
            container.Controls.Add(child);
        }
    }

Item.cs

[Serializable]
    public class Item
    {
        // Properties
        [XmlAttribute]
        public string Path { get; set; }

        [XmlAttribute]
        public string Title { get; set; }

        [XmlAttribute]
        public string Url { get; set; }
    }

GlobalTab.cs

[Serializable]
    public class GlobalTab
    {
        // Methods
        public GlobalTab()
        {
            if (this.ItemCol == null)
            {
                this.ItemCol = new List<Item>();
            }
        }

        // Properties
        [XmlElement("Item")]
        public List<Item> ItemCol { get; set; }
    }

Config.cs

 internal class Config
    {
        // Methods
        public static GlobalTab Deserialize(string xml)
        {
            using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(GlobalTab));
                return (GlobalTab)serializer.Deserialize(stream);
            }
        }

        public static XmlDataSource GetDataSource(SPWeb web, NavType navType)
        {
            XmlDataSource source = new XmlDataSource();
            try
            {
                string innerXml = Load(web, navType);
                if (string.IsNullOrEmpty(innerXml))
                {
                    return source;
                }
                XmlDocument document = new XmlDocument();
                document.LoadXml(innerXml);
                if (!web.IsRootWeb && (document.DocumentElement.GetAttribute("Inherited").ToLower() == "true"))
                {
                    innerXml = LoadParent(web.ParentWeb, navType);
                    document.LoadXml(innerXml);
                }
                if (!web.UserIsSiteAdmin)
                {
                    XmlNodeList list = document.SelectNodes("//SiteMapNode[@SPGroups]");
                    for (int i = 0; i < list.Count; i++)
                    {
                        string[] strArray = list[i].Attributes["SPGroups"].Value.Split(new char[] { ';' });
                        bool flag = false;
                        foreach (string groupName in strArray)
                        {
                            if ((from g in web.Groups.Cast<SPGroup>() select g.Name).Contains<string>(groupName))
                            {
                                SPGroup group = web.Groups[groupName];
                                //flag = (from g in web.CurrentUser.Groups.Cast<SPGroup>() select g.Name).Contains<string>(group.Name);
                                flag = group.ContainsCurrentUser;
                            }
                            if (flag)
                            {
                                break;
                            }
                        }
                        if (!flag)
                        {
                            list[i].ParentNode.RemoveChild(list[i]);
                        }
                    }
                }
                foreach (XmlNode node in document.SelectNodes("//SiteMapNode[@url]"))
                {
                    string url = node.Attributes["url"].Value;
                    node.Attributes["url"].Value = url.Replace("~site/", SPMIPUtility.GetRelative(web));
                }
                innerXml = document.InnerXml;
                source.Data = innerXml;
                source.XPath = "/SiteMap/*";
                source.DataBind();
                source.EnableCaching = false;
            }
            catch (Exception exception)
            {
                SPMIPTrace.WriteError("SPMIPNavigation", exception);
            }
            return source;
        }

        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 string LoadParent(SPWeb web, NavType navType)
        {
            if (web == null)
            {
                return null;
            }
            string str = null;
            try
            {
                str = Load(web, navType);
                if (!string.IsNullOrEmpty(str))
                {
                    return str;
                }
                return LoadParent(web.ParentWeb, navType);
            }
            catch
            {
                return LoadParent(web.ParentWeb, navType);
            }
        }

        public static string Serialize(GlobalTab _class)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                XmlSerializer serializer = new XmlSerializer(typeof(GlobalTab));
                XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
                namespaces.Add(string.Empty, string.Empty);
                serializer.Serialize(stream, _class, namespaces);
                stream.Position = 0;
                byte[] buffer = new byte[stream.Length];
                stream.Read(buffer, 0, buffer.Length);
                return Encoding.UTF8.GetString(buffer);
            }
        }

        // Nested Types
        public enum NavType
        {
            Top,
            Left
        }
    }
时间: 2024-11-06 08:30:18

SharePoint开发 - 自定义导航菜单(三)附其他代码的相关文章

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

本篇描述自定义sharepoint菜单的一种方式,自定义菜单适用于一些门户等需求的网站 自定义的菜单有自己的数据源,可以是数据表,可以是XML,本篇叙述的是采用XML数据源作为菜单的声明定义部分,将XML以文件的格式保存到网站中自己创建的配置文档库中 XML菜单的格式形如下面的格式,其中有菜单标题title属性,有菜单所属的权限用户组SPGroups属性,有菜单的链接url属性,实际应用中可以添加更多的字段. <SiteMap> <SiteMapNode title="我的项目

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

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

SharePoint 2013 自定义扩展菜单

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

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

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

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

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

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

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

微信二次开发自定义接受事件推送的代码

<?php /** * wechat php test */ //define your token define("TOKEN", "<span style="color:#ff0000;">xxxxx</span>"); $wechatObj = new wechatCallbackapiTest(); $wechatObj->responseMsg(); class wechatCallbackapiTe

MDNavBarView下拉导航菜单(仿美团导航下拉菜单)

说到下拉导航菜单这个东西用得还真不少,细心算一下做开发以来这样的菜单已经写了第三次了,但基本都是不能复用.感觉特累人.不经意看到同事写一个类似的下拉菜单,但他引用了开源库仿大众菜单的库,大致看了一下,感觉挺不错的,复用性也比较好,但要 是换成别的样式就要去修改代码了,感觉这有点不方便也比较容易出错.于是参照他的大致思路写了一个仿下拉菜单. 具体的实现就不多说了,觉得有意思的话可以下来看看.下面说一下使用方法吧: 1.添加navbarview包下的代码与对应资源 2.布局文件中添加: <com.m

5.JavaScript优化及导航菜单背后的秘密

JavaScript优化及导航菜单背后的秘密 伍星 学习目标1.进一步了解前端优化 学习如何编写良好的 JavaScirpt2.通过导航的学习,了解JavaScirpt的应用 JavaScript在用户体验优化的实现中起着至关重要的作用3.前端开发相关的工具和手段了解 了解JavaScript开发相关的工具和手段 目录 CONTENTS1 回顾:HTML语义.CSS高级2 编写高效的 JavaScript3 认识导航菜单及其开发4 导航菜单的性能加速5 破解牛X导航菜单的秘密5 JS的调试.压缩