• SharePoint 2010 Ribbon的实现


    转:http://blog.csdn.net/wang4237/article/details/5306335

    SharePoint2010的页面风格发生了很大的改变,其页面风格类似于Office的视图,这种视图被称为Ribbon视图。
     
    其中SharePoint里面对应得控件为SPRibbon控件。在Master page里面是这么添加这个控件的:
    <SharePoint:SPRibbon runat="server" PlaceholderElementId="RibbonContainer" CssFile="">.......</SharePoint:SPRibbon>
     
    在使用之前必须将Ribbon的XML结构定义好,XML路径为/TEMPLATE/GLOBAL/XML/CMDUI.XML。这个XML的具体结构,如何定义还在研究当中,会在之后发布。
     
    然而这些并不够,在SharePoint2010里面,不同的页面有不同ribbon,如何去为页面设置它的ribbon,并设置Ribbon中的Button的页面弹出框的URL。
     
    经过查看SharePoint源代码,在页面的后台代码中发现这么一段代码:
            SPRibbon current = SPRibbon.GetCurrent(this); if (current != null)
            {
                current.CommandUIVisible = true;
                current.MakeTabAvailable("Ribbon.Read");
                current.MakeTabAvailable("Ribbon.WebApp");
                current.InitialTabId = "Ribbon.WebApp";
                current.Minimized = false;
                SPRibbonScriptManager manager = new SPRibbonScriptManager();
                List<IRibbonCommand> commands = new List<IRibbonCommand>();
                bool admin = base.GlobalAdmin.IsCurrentUserMachineAdmin();
                commands.Add(new SPRibbonCommand("WebAppTab"));
          ......
            }
    在之前给大家介绍了Ribbon的主体结构。在这次主要为大家介绍如何实现页面的定制,即在页面中如何控制ribbon中这些Button是如何Enable和Disable的和弹出页面,以及一些SharePoint的比较适用的JS方法。
     
    首先现在TEMPLATE/GLOBAL/XML/CMDUI.XML中定义Tab结构。在这个XML中定义好在页面上Ribbon的Button,以及这些Button的Text,ToolTil, Image,以及排列方式。
     
    之后要实现页面的Ribbon,需为这个页面定义一个JS对象,在这个对象中要声明一些方法:
    仿照SharePoint,定义方式如下:
    Type.registerNamespace("SP.UI.Admin");
    SP.UI.Admin.TestPageComponent = function() {
        ULSITv: ;
        //SP.UI.Admin.ServiceApplicationPageComponent.initializeBase(this);
    };
    SP.UI.Admin.TestPageComponent.TestIsEnabled = function(a) {
        return true;
    };
    SP.UI.Admin.TestPageComponent.TestNavigate = function(a, b, c) {
            var b = SP.UI.$create_DialogOptions();
            b.url = a; b.dialogReturnValueCallback = SP.UI.Admin.TestPageComponent.$5_1;
            SP.UI.ModalDialog.showModalDialog(b)
    };
    SP.UI.Admin.TestPageComponent.prototype = {
        getFocusedCommands: function() {
            ULSITv: ; return []
        },
        getGlobalCommands: function() {
            ULSITv: ;
            return getGlobalCommands()
        },
        isFocusable: function() {
            ULSITv: ;
            return true
        },
        receiveFocus: function() {
            ULSITv: ;
            return true
        },
        yieldFocus: function() {
            ULSITv: ;
            return true
        },
        canHandleCommand: function(a) {
            ULSITv: ;
            return commandEnabled(a)
        },
        handleCommand: function(b, a, c) {
            ULSITv: ;
            return handleCommand(b, a, c)
        },
        getId: function() {
            ULSITv: ;
            return "TestPageComponent"
        },
        init: function() {
            ULSITv: ;
        },
    };
    prototype的getId和init方法,在SharePoint的其他JS并没有定义,但是在DEBUG代码时却发现SharePoint的JS类有这个两个方法,目前没找到他们是在哪定义,我在这直接定义,不定义就会异常。
     
    SP.UI.Admin.TestPageComponent.registerClass("SP.UI.Admin.TestPageComponent", CUI.Page.PageComponent);
    1.点击Ribbon的Button是触发的方法:TestNavigate
    2.决定Ribbon的Button是否Enable的方法:TestIsEnabled
    写完JS之后,需要在代码声明一个继承 SPRibbonCommand的类TestCommand ,
    在这个类实现如下
    internal sealed class TestCommand : SPRibbonCommand
        {
            public TestCommand(string commandId, string target, TestNavigateOptions options, bool admin)
                : base(commandId, null, null)
            {            
                base.HandlerStatement = string.Format(CultureInfo.InvariantCulture, "SP.UI.Admin.TestPageComponent.TestNavigate('{0}', {1}, {2})", new object[] { SPHttpUtility.EcmaScriptStringLiteralEncode(target), "true", "true");
                base.EnabledStatement = "SP.UI.Admin.TestPageComponent.TestIsEnabled(0)";
            }
    }
     
     
    然后在页面的后台类中写入如下代码:
    protected override void OnPreRender(EventArgs e)
            {
                base.OnPreRender(e);
                  SPRibbon current = SPRibbon.GetCurrent(this);
                  if (current != null)
                  {
                      current.CommandUIVisible = true;
                      current.MakeTabAvailable("Ribbon.Read");
                      current.MakeTabAvailable("Ribbon.Test");
                      current.InitialTabId = "Ribbon.Test";
                      current.Minimized = false;
                      SPRibbonScriptManager manager = new SPRibbonScriptManager();
                      List<IRibbonCommand> commands = new List<IRibbonCommand>();
                      bool admin = base.GlobalAdmin.IsCurrentUserMachineAdmin();
                      commands.Add(new SPRibbonCommand("TestTab"));
                      commands.Add(new SPRibbonCommand("TestG1Group"));
                      commands.Add(new TestCommand("Test_New", "test.aspx", TestNavigateOptions.AppendSelectionIdParameter, admin));
                      commands.Add(new TestCommand("Test_Extend", "extendwebfarm.aspx?WebApplicationId=", TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog, admin));
                      commands.Add(new TestCommand("Test_DeleteTop", "DeleteWebApplication.aspx?WebApplicationId=", TestNavigateOptions.DisableForCentralAdmin | TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog, admin));
                      commands.Add(new TestCommand("Test_Delete", "DeleteWebApplication.aspx?WebApplicationId=", TestNavigateOptions.DisableForCentralAdmin | TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog | TestNavigateOptions.Privileged, admin));
                      commands.Add(new TestCommand("Test_DeleteIIS", "unextendvs.aspx?WebApplicationId=", TestNavigateOptions.DisableForCentralAdmin | TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog | TestNavigateOptions.Privileged, admin));
                      commands.Add(new SPRibbonCommand("TestG2Group"));
                      commands.Add(new TestCommand("Test_SettingsTop", "vsgeneralsettings.aspx?type=gen&WebApplicationId=", TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog, admin));
                      commands.Add(new TestCommand("Test_Settings", "vsgeneralsettings.aspx?type=gen&WebApplicationId=", TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog, admin));
                      commands.Add(new TestCommand("Test_ResourceThrottling", "vsgeneralsettings.aspx?type=res&WebApplicationId=", TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog, admin));
                      commands.Add(new TestCommand("Test_Workflow", "workflowAdmin.aspx?WebApplicationId=", TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog, admin));
                      commands.Add(new TestCommand("Test_Outgoing", "VSEmail.aspx?WebApplicationId=", TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog, admin));
                      commands.Add(new TestCommand("Test_OutgoingXms", "VSXms.aspx?WebApplicationId=", TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog, admin));
                      commands.Add(new TestCommand("Test_Features", "ManageWebAppFeatures.aspx?WebApplicationId=", TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog, admin));
                      commands.Add(new TestCommand("Test_Paths", "scprefix.aspx?WebApplicationId=", TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog, admin));
                      commands.Add(new TestCommand("Test_Connections", "ApplicationAssociationsDialog.aspx?Editable=false&ApplicationId=", TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog, admin));
                      commands.Add(new TestCommand("Test_SharePointDesigner", "SharePointDesignerAdmin.aspx?WebApplicationId=", TestNavigateOptions.AppendSelectionIdParameter | TestNavigateOptions.ModalDialog, admin));
                      manager.RegisterGetCommandsFunction(this, "getGlobalCommands", commands);
                      manager.RegisterCommandEnabledFunction(this, "commandEnabled", commands);
                      manager.RegisterHandleCommandFunction(this, "handleCommand", commands);
     
                      Type type = manager.GetType();
                      MethodInfo mi = type.GetMethod("RegisterPageComponent", BindingFlags.Instance | BindingFlags.NonPublic);
                      mi.Invoke(manager, new object[] { this, "SP.UI.Admin.js", "/_layouts/SP.UI.Admin.js", "SP.UI.Admin.TestPageComponent" });


                  }
            }
     
    由于上面的JS代码我是直接写在SP.UI.Admin.js中的,如果是自己单独写的JS文件,将这个文件名换掉即可。
     
    之前并不清楚Ribbon的Tab可以在Feature中添加,不需要修改SharePoint的TEMPLATE/GLOBAL/XML/CMDUI.XML文件
     
    在Feature中定义:
     <?xml version="1.0" encoding="utf-8" ?>
    - <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
    - <CustomAction Id="TestRibbon" Location="CommandUI.Ribbon" Sequence="100" Title="Test">
    - <CommandUIExtension>
    - <CommandUIDefinitions>
    - <CommandUIDefinition Location="Ribbon.Tabs._children">
    - <Tab Id="Ribbon.Test" Sequence="1300" Command="TestTab" Title="Test" Description="First Ribbon Test">
    - ......
    )  </Tab>
      </CommandUIDefinition>
      </CommandUIDefinitions>
      </CommandUIExtension>
      </CustomAction>
      </Elements>
    安装Feature后即可像之前一样使用。
     
    另外Ribbon对应的JS方法可以直接写在页面上,然后将代码改成:
    mi.Invoke(manager, new object[] { this, "SP.UI.Admin.js", "/_layouts/SP.UI.Admin.js", "SP.UI.Admin.WebApplicationPageComponent" });
     
    也就不用重新写那些JS方法,只需将下面两个方法加入ASPX页面中。
    function TestIsEnabled(a) {
            return true;
        }
        function TestNavigate(a, b, c) {
            var b = SP.UI.$create_DialogOptions();
            b.url = a;
            SP.UI.ModalDialog.showModalDialog(b)
        }
    熟悉SharePoint2010的人都知道,SharePoint会弹出一个窗体来单独显示一个页面, SP.UI.ModalDialog.showModalDialog就是这个功能的实现的JS代码。想更详细了解,可以访问:http://blogs.msdn.com/jfrost/default.aspx
    这样的好处是可以少写一些JS代码。而核心部分PageComponent还是直接使用SharePoint的JS类。
  • 相关阅读:
    今天解决了一个很郁闷的问题!
    解决了安装golive后html文件图标显示错误的问题
    [转载]Asp.Net 2.0 发布问题
    使用 Visual Studio 2005 构建“WPFE”项目
    Ajax学习网址备忘录
    [原创首发]深圳博客问测系统正式发布啦!
    如何在用户控件里联动Dropdownlist
    [转载]在ASP.NET中值得注意的两个地方
    [转]Prototype 1.5 Ajax 使用教程
    1038 Recover the Smallest Number (30 分)(贪心)
  • 原文地址:https://www.cnblogs.com/jackljf/p/3589193.html
Copyright © 2020-2023  润新知