SharePoint 的 Facebook Web 部件 - 第 2 部分





5.00/5 (2投票s)
第二篇文章,展示如何使用 Visual Studio 2010 创建 Facebook 留言板 Webpart。
引言
在本系列的两部分文章中,第一部分描述了 Facebook 留言板 Webpart 的开发。在第二部分中,我们将使用 Visual Studio 2010 开发 Facebook 留言板 Webpart,这将使您能够从 SharePoint 门户在 Facebook 墙、群组墙和页面上发表留言。所有源代码都可以从我们的开源项目下载:
您需要预先安装的组件
要跟随本演示,您需要安装以下要求:
- SharePoint 2010
- Visual Studio 2010
创建项目
- 使用 Visual Studio 2010 创建一个名为
WriteOnWall
的新空 SharePoint 项目。 - 当 SharePoint 自定义向导提示时,提供一个站点 URL 并进行验证。然后选择“部署为场解决方案”选项。单击“完成”。
- 这将为您创建一个包含默认项目项的解决方案。最后,向解决方案添加一个类型为 WebPart 的新项。
- 这将创建一个解决方案。重要的文件是 Element.xml、WritOnWall.cs 和 WriteOnWall.webpart。
实现主代码
- 现在我们将代码放入 WriteOnWall.cs 文件中。首先,我们需要做的是继承 Microsoft.SharePoint.WebPartPages.WebPart 和 IWebEditable 接口。我们继承了 IWebEditable 接口是为了创建一个自定义的工具部件,因为我们需要在稍后讨论的属性填充部分提供不同的功能。
- 由于我们继承了 IWebEditable 接口,我们需要编写一些方法,如下所示。这提供了一个接口来指定与 WebPart 控件关联的自定义编辑控件。
- 接下来,我们需要定义 WebPart 属性,以便获取将连接到 WebPart 的帐户的详细信息以及 WebPart 的 UI 所需的一些其他信息。正如我们所见,我们将这些属性设置为 Web-browsable false,这是因为我们将创建一个自定义的工具部件,并从那里设置这些值。
- 创建了一个名为
WriteOnWallEditorPart.cs
的新类,它继承了EditorPart
类。在这个类中,我们将通过重写EditorPart
类的一些方法来创建一个自定义的属性部分。在这个类中,我们有一个带参数的构造函数,用于设置编辑器部件的 ID 和标题。 - 首先,重写的方法是
CreateChildControl()
,它负责创建每个所需属性的 UI 部分。 - 其次,需要重写的方法是
ApplyChanges()
方法,当我们在编辑 WebPart 属性时单击“应用”按钮时,会触发此方法。 - 第三,我们将重写的方法是
SyncChanges()
,它负责将工具部件中的控件的值更新到 WebPart 属性值。 - 我们还添加了一个
OnPreRender
方法,因为我们需要注册 JavaScript 来根据用户的选择显示和隐藏某些控件。 - 这就是我们需要对编辑器部件部分(WriteOnWallEditorPart.cs)所做的全部工作。
-
现在回到 WriteOnWall.cs 文件
- 在这里,我们也需要重写
CreateChildControls()
方法,该方法将负责创建 WebPart 的 UI。我们还将在 catch 块中创建一个标签,用于显示发生的错误的错误消息。 - 现在将有四个支持方法在使用上述方法中。
oAuthToken
是一个字符串变量,用于获取用户身份验证令牌,以便在从 Facebook 获取用户动态时使用。此方法编写在一个通用的帮助类 CommonHelper.cs 中。GetUserPages()
是一个私有方法,用于获取用户的所有页面,这样如果用户选择在页面上发布消息,就可以从用户的帐户中检索该页面,并将消息发布出去。GetUserGroups()
是一个私有方法,用于获取用户的所有群组,这样如果用户选择在群组墙上发布消息,就可以从用户的帐户中检索该群组,并将消息发布到该群组墙上。- 现在,让我们继续处理最重要的一个方法,该方法执行所有主要操作:
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); } }
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; }
}
region Webpart Properties
[WebBrowsable(false),
Personalizable(PersonalizationScope.Shared)]
public string OAuthCode { get; set; }
....
#endregion
public WriteOnWallEditorPart(string webPartID)
{
this.ID = "WriteOnWallEditorPart" + webPartID;
this.Title = "Facebook Settings";
}
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);
}
public override bool ApplyChanges()
{
EnsureChildControls();
WriteOnWall webPart = WebPartToEdit as WriteOnWall;
if (webPart != null)
{
webPart.OAuthCode = txtAuthCode.Text;
webPart.OAuthClientID = txtAuthClientID.Text;
.....
}
return true;
}
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;
}
......
}
}
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');");
}
}
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
{
.....
}
}
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;
}
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;
}
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;
}
构建和部署 WebPart
- 现在,在 Visual Studio 中构建解决方案,然后单击“部署”进行部署。
- 请确保在应用程序的 web.config 文件中为 WriteOnWall 项目 DLL 添加了 safecontrol 条目。
- 成功部署后,打开您的 SharePoint 网站。转到“站点操作”->“站点设置”->“库”->“Web 部件”。在这里,您应该会看到 WriteOnWall Webpart 列出。
- 要在您的页面上使用它,请按照提到的步骤进行。打开您想要使用 Write On Wall Webpart 的页面。让我们创建一个名为
WriteOnWallTestPage
的新页面。为此,首先转到“站点页面”->“所有页面”。 - 单击“添加新页面”链接,然后单击“创建”来创建新页面。
- 现在您看到一个空白页面。在“编辑工具”标题下的“插入”选项卡上单击,然后再次单击“Web 部件”。
- 在“类别”部分移至“Brickred”。选择 WriteOnWall Webpart 并单击“添加”。WriteOnWall Webpart 已添加到页面。单击 WriteOnWall WebPart 标题右侧的“编辑 WebPart”图标,然后单击“编辑 Web Part”。
- 这将在右侧打开 Web Part 属性窗口。请参考下图。
- 输入您的用户 ID。这是必需的。在“墙计数”中输入一个整数。它将显示 Web Part 上已发布的墙的数量。如果您选中“显示描述”,它将显示墙的日期和时间,否则则不显示。单击顶部功能区上的“保存并关闭”按钮。您就完成了!您应该在 Facebook 上看到已填充您帖子的 Web Part。
结论
在本篇文章中,我们展示了在 Facebook 墙上写消息的第二项功能。上面显示的源代码仅是突出显示的语法,不包含完整的实现。请从上面提供的链接下载源代码以查看完整的源代码。但是,如果您想快速查看并且对代码感到满意,可以直接访问 http://code.google.com/p/sharepoint-facebook-wall。
历史
- 2012 年 5 月 18 日:初始版本