65.9K
CodeProject 正在变化。 阅读更多。
Home

SharePoint 的 Facebook Web 部件 - 第 2 部分

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2012年6月20日

MIT

5分钟阅读

viewsIcon

35931

downloadIcon

320

第二篇文章,展示如何使用 Visual Studio 2010 创建 Facebook 留言板 Webpart。

引言

在本系列的两部分文章中,第一部分描述了 Facebook 留言板 Webpart 的开发。在第二部分中,我们将使用 Visual Studio 2010 开发 Facebook 留言板 Webpart,这将使您能够从 SharePoint 门户在 Facebook 墙、群组墙和页面上发表留言。所有源代码都可以从我们的开源项目下载:

您需要预先安装的组件

要跟随本演示,您需要安装以下要求: 

  • SharePoint 2010 
  • Visual Studio 2010 

创建项目

  1. 使用 Visual Studio 2010 创建一个名为 WriteOnWall 的新空 SharePoint 项目。
  2. 当 SharePoint 自定义向导提示时,提供一个站点 URL 并进行验证。然后选择“部署为场解决方案”选项。单击“完成”。 
  3. 这将为您创建一个包含默认项目项的解决方案。最后,向解决方案添加一个类型为 WebPart 的新项。 
  4. 这将创建一个解决方案。重要的文件是 Element.xmlWritOnWall.csWriteOnWall.webpart。 

实现主代码

  1. 现在我们将代码放入 WriteOnWall.cs 文件中。首先,我们需要做的是继承 Microsoft.SharePoint.WebPartPages.WebPartIWebEditable 接口。我们继承了 IWebEditable 接口是为了创建一个自定义的工具部件,因为我们需要在稍后讨论的属性填充部分提供不同的功能。 
  2. 由于我们继承了 IWebEditable 接口,我们需要编写一些方法,如下所示。这提供了一个接口来指定与 WebPart 控件关联的自定义编辑控件。
  3. EditorPartCollection IWebEditable.CreateEditorParts()
    {
       EditorPartCollection defaultEditors = base.CreateEditorParts();
       List<EditorPart> editors = new List<EditorPart>();
       editors.Add(new WriteOnWallEditorPart(this.ID));
       return new EditorPartCollection(defaultEditors, editors);
    }
     
    object IWebEditable.WebBrowsableObject
    {
       get { return this; }
    }
  4. 接下来,我们需要定义 WebPart 属性,以便获取将连接到 WebPart 的帐户的详细信息以及 WebPart 的 UI 所需的一些其他信息。正如我们所见,我们将这些属性设置为 Web-browsable false,这是因为我们将创建一个自定义的工具部件,并从那里设置这些值。
  5. region Webpart Properties
     
    [WebBrowsable(false),
    Personalizable(PersonalizationScope.Shared)]
    public string OAuthCode { get; set; }
     
    ....
     
    #endregion
  6. 创建了一个名为 WriteOnWallEditorPart.cs 的新类,它继承了 EditorPart 类。在这个类中,我们将通过重写 EditorPart 类的一些方法来创建一个自定义的属性部分。在这个类中,我们有一个带参数的构造函数,用于设置编辑器部件的 ID 和标题。
  7. public WriteOnWallEditorPart(string webPartID)
    {
        this.ID = "WriteOnWallEditorPart" + webPartID;
        this.Title = "Facebook Settings";
    
    }
  8. 首先,重写的方法是 CreateChildControl(),它负责创建每个所需属性的 UI 部分。
  9. protected override void CreateChildControls() 
    { 
        base.CreateChildControls();
        pnlFacebookSettings = new Panel();
        pnlCommonSettings = new Panel();
        pnlPostToWallSettings = new Panel();
        lineBreak = new LiteralControl("<br/>");
        seperatorDiv = new Panel();
        seperatorDiv.Attributes.Add("class", "UserDottedLine");
        seperatorDiv.Attributes.Add("style", "width: 100%;");
        
        //Code
        pnlProperty = new Panel();           
        pnlPropertyName = new Panel();
        pnlPropertyControl = new Panel();
    
        .....                      
        rdoBtnListPostLocation = new RadioButtonList();
        rdoBtnListPostLocation.Items.Add(new ListItem("On my wall", "postToYourWall"));
        rdoBtnListPostLocation.Items.Add(new ListItem("On my page", "postToPageWall"));
        .....
        rdoBtnListPostLocation.AutoPostBack = false;
        pnlPropertyControl.Controls.Add(rdoBtnListPostLocation);
        pnlProperty.Controls.Add(pnlPropertyControl);
    
        pnlPostToWallSettings.Controls.Add(pnlProperty); 
         
        ....
     
        this.Controls.Add(pnlFacebookSettings);
    
    }
  10. 其次,需要重写的方法是 ApplyChanges() 方法,当我们在编辑 WebPart 属性时单击“应用”按钮时,会触发此方法。 
  11. public override bool ApplyChanges() 
    { 
        EnsureChildControls();
    
        WriteOnWall webPart = WebPartToEdit as WriteOnWall; 
    
        if (webPart != null) 
        { 
            webPart.OAuthCode = txtAuthCode.Text;
            webPart.OAuthClientID = txtAuthClientID.Text;
             .....
        }
    
        return true; 
    }
  12. 第三,我们将重写的方法是 SyncChanges(),它负责将工具部件中的控件的值更新到 WebPart 属性值。 
  13. public override void SyncChanges() 
    { 
        EnsureChildControls();
        WriteOnWall webPart = WebPartToEdit as WriteOnWall;
            if (webPart != null)
            {
                txtAuthCode.Text = webPart.OAuthCode;
                txtAuthClientID.Text = webPart.OAuthClientID;
                txtAuthClientSecret.Text = webPart.OAuthClientSecret;
                txtAuthRedirectUrl.Text = webPart.OAuthRedirectUrl;
    
                if (chkShowUserName.Visible)
                {
                    chkShowUserName.Checked = webPart.EnableShowUserName;
    
                }
    
                ......
           }
    }
  14. 我们还添加了一个 OnPreRender 方法,因为我们需要注册 JavaScript 来根据用户的选择显示和隐藏某些控件。 
  15. protected override void OnPreRender(EventArgs e)
    {
        ....
    
        this.Page.ClientScript.RegisterStartupScript(this.GetType(), 
             "scriptShowHidePostAsWhatDiv", scriptShowHidePostAsWhatDiv);
        foreach (ListItem item in rdoBtnListPostLocation.Items)
        {
            item.Attributes.Add("onclick", "ShowHidePostAsWhatDiv('" + item.Value + "','postAsWhatDiv');");
        }
    }
  16. 这就是我们需要对编辑器部件部分(WriteOnWallEditorPart.cs)所做的全部工作。 
  17. 现在回到 WriteOnWall.cs 文件 

  18. 在这里,我们也需要重写 CreateChildControls() 方法,该方法将负责创建 WebPart 的 UI。我们还将在 catch 块中创建一个标签,用于显示发生的错误的错误消息。 
  19. protected override void CreateChildControls()
    {
        if (!String.IsNullOrEmpty(this.OAuthCode) ||
                !String.IsNullOrEmpty(this.OAuthClientID) ||
                !String.IsNullOrEmpty(this.OAuthRedirectUrl) ||
                !String.IsNullOrEmpty(this.OAuthClientSecret) ||
                !String.IsNullOrEmpty(this.UserID)
                )
        {
    
            //first get the authentication token 
            oAuthToken = CommonHelper.GetOAuthToken("publish_stream", 
               OAuthClientID, OAuthRedirectUrl, OAuthClientSecret, OAuthCode);
    
            this.Page.Header.Controls.Add(CommonHelper.InlineStyle());
            base.CreateChildControls();
            try
            {
                ....
                buttonWriteOnWall = new Button();
                buttonWriteOnWall.ForeColor = Color.White;
                buttonWriteOnWall.BackColor = Color.FromArgb(84, 116, 186);
                buttonWriteOnWall.Text = "Share";
                buttonWriteOnWall.Click += new EventHandler(buttonWriteOnWall_Click);
                tc.Controls.Add(buttonWriteOnWall);
    
            }
            catch (Exception Ex)
            {
                ....
            }
        }
        else
        {
            .....
        }
    }
  20. 现在将有四个支持方法在使用上述方法中。
  21. oAuthToken 是一个字符串变量,用于获取用户身份验证令牌,以便在从 Facebook 获取用户动态时使用。此方法编写在一个通用的帮助类 CommonHelper.cs 中。 
  22. public static string GetOAuthToken(string scope, string OAuthClientID, 
                  string OAuthRedirectUrl, string OAuthClientSecret, string OAuthCode)
    {
        string oAuthToken = string.Empty;
       
        string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id" + 
           "={0}&redirect_uri={1}&client_secret={2}&code={3}&scope={4}", 
           OAuthClientID, OAuthRedirectUrl, OAuthClientSecret, OAuthCode,scope);
    
        url = url.Replace(" ", string.Empty);
    
        //get the server certificate for calling https 
        ServicePointManager.ServerCertificateValidationCallback = 
          new System.Net.Security.RemoteCertificateValidationCallback(ValidateFacebookCertificate);
        WebRequest request = WebRequest.Create(url) as HttpWebRequest;
    
        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
        {
            StreamReader reader = new StreamReader(response.GetResponseStream());
            string retVal = reader.ReadToEnd();
            oAuthToken = retVal.Substring(retVal.IndexOf("=") + 1, 
                         retVal.Length - retVal.IndexOf("=") - 1);
        }
    
        return oAuthToken;
    }
  23. GetUserPages() 是一个私有方法,用于获取用户的所有页面,这样如果用户选择在页面上发布消息,就可以从用户的帐户中检索该页面,并将消息发布出去。 
  24. private JSONObject GetUserPages(string oAuthToken)
    {
        JSONObject obj = null;
        string url;
        HttpWebRequest request;
    
        try
        {
            url = string.Format("https://graph.facebook.com/me/accounts?access_token={0}", oAuthToken);
            request = WebRequest.Create(url) as HttpWebRequest;
            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
            {
                StreamReader reader = new StreamReader(response.GetResponseStream());
                string retVal = reader.ReadToEnd();
    
                obj = JSONObject.CreateFromString(retVal);
                if (obj.IsDictionary && obj.Dictionary.ContainsKey("error"))
                {
                    throw new Exception(obj.Dictionary["error"].Dictionary["type"].String, 
                          new Exception(obj.Dictionary["error"].Dictionary["message"].String));
                }
            }
        }
        catch (Exception Ex)
        {
            ....
        }
        return obj;
    }
  25. GetUserGroups() 是一个私有方法,用于获取用户的所有群组,这样如果用户选择在群组墙上发布消息,就可以从用户的帐户中检索该群组,并将消息发布到该群组墙上。 
  26. private JSONObject GetUserGroups(string oAuthToken)
    {
        JSONObject obj = null;
        string url;
        HttpWebRequest request;
    
        try
        {
            url = string.Format("https://graph.facebook.com/me/groups?access_token={1}", 
                                this.OAuthPageID.Trim().ToString(), oAuthToken);
    
            request = WebRequest.Create(url) as HttpWebRequest;
            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
            {
                StreamReader reader = new StreamReader(response.GetResponseStream());
                string retVal = reader.ReadToEnd();
    
                obj = JSONObject.CreateFromString(retVal);
                if (obj.IsDictionary && obj.Dictionary.ContainsKey("error"))
                {
                    throw new Exception(obj.Dictionary["error"].Dictionary["type"].String, 
                      new Exception(obj.Dictionary["error"].Dictionary["message"].String));
                }
            }
        }
        catch (Exception Ex)
        {
            .....
        }
        return obj;
    }
  27. 现在,让我们继续处理最重要的一个方法,该方法执行所有主要操作:buttonWriteOnWall_Click()。此方法是“分享”按钮的点击事件,在用户在消息框中输入消息后,它会将消息发布到配置的墙上。 

    void buttonWriteOnWall_Click(object sender, EventArgs e)
    {
        try
        {
            bool userMemberOfGroup = false;
            string postUrl = string.Empty;
            if (this.PostOnProfile)
            {
                postUrl = string.Format("https://graph.facebook.com/me/feed?access" + 
                   "_token={0}&message={1}", oAuthToken, textWall.Text.Trim());
            }
            ....
     
            if (!String.IsNullOrEmpty(postUrl))
            {
                HttpWebRequest request2 = WebRequest.Create(postUrl) as HttpWebRequest;
                request2.Method = "post";
                using (HttpWebResponse response2 = request2.GetResponse() as HttpWebResponse)
                {
                    StreamReader reader = new StreamReader(response2.GetResponseStream());
                    string retVal = reader.ReadToEnd();
    
                   .....
                }
            }
        }
        catch (Exception Ex)
        {
            LblMessage = new Label();
            LblMessage.Text = "An error occurred while posting on wall:" + Ex.Message;
            this.Controls.Add(LblMessage);
        }
    }

构建和部署 WebPart

  1. 现在,在 Visual Studio 中构建解决方案,然后单击“部署”进行部署。 
  2. 请确保在应用程序的 web.config 文件中为 WriteOnWall 项目 DLL 添加了 safecontrol 条目。 
  3. 成功部署后,打开您的 SharePoint 网站。转到“站点操作”->“站点设置”->“库”->“Web 部件”。在这里,您应该会看到 WriteOnWall Webpart 列出。 
  4. 要在您的页面上使用它,请按照提到的步骤进行。打开您想要使用 Write On Wall Webpart 的页面。让我们创建一个名为 WriteOnWallTestPage 的新页面。为此,首先转到“站点页面”->“所有页面”。 
  5. 单击“添加新页面”链接,然后单击“创建”来创建新页面。 
  6. 现在您看到一个空白页面。在“编辑工具”标题下的“插入”选项卡上单击,然后再次单击“Web 部件”。 
  7. 在“类别”部分移至“Brickred”。选择 WriteOnWall Webpart 并单击“添加”。WriteOnWall Webpart 已添加到页面。单击 WriteOnWall WebPart 标题右侧的“编辑 WebPart”图标,然后单击“编辑 Web Part”。 
  8. 这将在右侧打开 Web Part 属性窗口。请参考下图。 
  9. 输入您的用户 ID。这是必需的。在“墙计数”中输入一个整数。它将显示 Web Part 上已发布的墙的数量。如果您选中“显示描述”,它将显示墙的日期和时间,否则则不显示。单击顶部功能区上的“保存并关闭”按钮。您就完成了!您应该在 Facebook 上看到已填充您帖子的 Web Part。 

结论

在本篇文章中,我们展示了在 Facebook 墙上写消息的第二项功能。上面显示的源代码仅是突出显示的语法,不包含完整的实现。请从上面提供的链接下载源代码以查看完整的源代码。但是,如果您想快速查看并且对代码感到满意,可以直接访问 http://code.google.com/p/sharepoint-facebook-wall。 

历史

  • 2012 年 5 月 18 日:初始版本
© . All rights reserved.