一個Silverlight的網頁訪問計數器

作者: Tonnie  來源: 博客園  發布時間: 2010-10-17 22:34  閱讀: 1502 次  推薦: 0   原文鏈接   [收藏]  

  大家知道,SharePoint 2010支持客戶端的對象模型訪問,主要有三種方式:

  1..net 的客戶端對象模型,2.Javascript 的客戶端對象模型 3.Silverlight的客戶端對象模型,這里就簡單實現一個Silverlight的網頁計數器,來達到熟悉客戶端對象模型的目的。

  其實這個簡單的訪問計數器主要就是統計了頁面刷新了多少次,邏輯很簡單,當頁面被load的時候,就將次數+1,將次數和頁面的地址作為一個Item存放在一個SharePoint list中。下面介紹具體的步驟:

  1、準備工作:在SharePoint 2010的某一個site下創建用來存放訪問次數和頁面地址的list,我們可以取名為Hit Count list。

  2、VS2010中創建Silverlight Application Project,然后添加客戶端對象模型的dll引用,在SharePoint2010中,Silverlight的支持客戶端對象模型的dll文件一般存放在c:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ClientBin下,所以我們在項目中先Add Reference,在上面的路徑下添加Microsoft.SharePoint.Client.Silverlight.dll 和 Microsoft.SharePoint.Client.Silverlight.Runtime.dll兩個dll。

  3、在項目中添加一個Class,ClientOMProxy.cs作為silverlight訪問SharePoint2010數據的代理類,因為Silverlight訪問采用異步的方式,所以幾個基本的操作方法如下:

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Xml;
using System.Net;
using Microsoft.SharePoint.Client;


namespace ADSK.AEC.SP2010.ClientOM
{

public class ClientOMProxy:IDisposable
{

private ClientContext clientContext = null;
public ListItemCollection listItems = null;
public ClientOMProxy(string siteURL)
{

this.SiteURL = siteURL;
clientContext
= new ClientContext(this.SiteURL);
}


public void GetListItemsAsync(string listName, string viewXML, out ListItemCollection listItems, ClientRequestSucceededEventHandler successEventHandler, ClientRequestFailedEventHandler failEventHandler)
{
clientContext.Load(clientContext.Web);
List targetList
= clientContext.Web.Lists.GetByTitle(listName);
clientContext.Load(targetList);
CamlQuery camlQuery
= new CamlQuery();
camlQuery.ViewXml
= viewXML;
listItems
= targetList.GetItems(camlQuery);
clientContext.Load(listItems);
clientContext.ExecuteQueryAsync(successEventHandler, failEventHandler);
}


public void CreateListItemAsync(string listName, Dictionary<string, object> fieldValueDic, ClientRequestSucceededEventHandler onSuccess, ClientRequestFailedEventHandler onFail)
{
clientContext.Load(clientContext.Web);
List targetList
= clientContext.Web.Lists.GetByTitle(listName);
clientContext.Load(targetList);
ListItemCreationInformation itemCreateInfo
= new ListItemCreationInformation();
ListItem oListItem
= targetList.AddItem(itemCreateInfo);
foreach (KeyValuePair<string, object> pair in fieldValueDic)
{
oListItem[pair.Key]
= pair.Value;
}
oListItem.Update();
clientContext.Load(oListItem);
clientContext.ExecuteQueryAsync(onSuccess, onFail);
}


public void UpdateListItemAsync(string listName, ListItem item, Dictionary<string, object> fieldValueDic, ClientRequestSucceededEventHandler onSuccess, ClientRequestFailedEventHandler onFail)
{
clientContext.Load(clientContext.Web);
List targetList
= clientContext.Web.Lists.GetByTitle(listName);
clientContext.Load(targetList);
ListItem oListItem
= item;
foreach (KeyValuePair<string, object> pair in fieldValueDic)
{
oListItem[pair.Key]
= pair.Value;
}
oListItem.Update();
clientContext.Load(oListItem);
clientContext.ExecuteQueryAsync(onSuccess, onFail);
}


public void Dispose()
{

if (null != clientContext)
clientContext.Dispose();
}
}
}

  其中的ClientRequestSucceededEventHandler onSuccess, ClientRequestFailedEventHandler onFail分別為異步操作成功和失敗后的回調委托,可以在調用方法的時候傳出這兩個委托的具體實現。由于是客戶端程序,所以真正的操作都是在ExecuteQueryAsync方法調用時才開始執行的。

   4、在Main.xaml中添加頁面UI:

 
<UserControl xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input" x:Class="ADSK.AEC.SP2010.Portal.HitCount.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White" HorizontalAlignment="Left">
<Border CornerRadius="5" BorderThickness="2" BorderBrush="#B8BABD" Width="80" Height="40">
<StackPanel >
<TextBlock x:Name="txtHitName" FontFamily="Verdana" FontSize="10" Padding="2" Text="Page Hits" HorizontalAlignment="Center" VerticalAlignment="Center" FontStretch="ExtraExpanded">
</TextBlock>
<TextBox x:Name="txtHitCount" Text="" Foreground="Blue" FontSize="10" Padding="0" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" FontStretch="UltraCondensed" BorderThickness="0"></TextBox>
</StackPanel>
</Border>
</Grid>
</UserControl>

  用一個textbox來顯示訪問次數,在main.xaml.cs中添加實現邏輯:

 
public partial class MainPage : UserControl
{

private ADSK.AEC.SP2010.ClientOM.ClientOMProxy clientProxy = null;
private ListItemCollection targetHitCount = null;
public MainPage(string siteUrl)
{
InitializeComponent();

string currentPageURL = HtmlPage.Document.DocumentUri.ToString();
string viewXML = @"<View><ViewFields><FieldRef Name='HitCount'/></ViewFields><Query><Where><Eq><FieldRef Name='Title'/><Value Type='Text'>" + currentPageURL + "</Value></Where></Eq></Query></View>";
clientProxy
= new ClientOM.ClientOMProxy(siteUrl);
clientProxy.successEventHandler
+= new ClientRequestSucceededEventHandler(OnRequestSucceeded);
clientProxy.failEventHandler
+= new ClientRequestFailedEventHandler(OnRequestFailed);
clientProxy.GetListItemsAsync(
"Hit Count", viewXML, out targetHitCount);
}


private void BindData()
{

if (targetHitCount != null && targetHitCount.Count != 0)
{

long hitCount = Convert.ToInt64(targetHitCount[0]["HitCount"].ToString());
txtHitCount.Text
= (hitCount + 1).ToString();
lock (targetHitCount[0])
{
Dictionary
<string, object> fieldValueDic = new Dictionary<string, object>();
fieldValueDic[
"HitCount"] = hitCount+1;
clientProxy.UpdateListItemAsync(
"Hit Count", targetHitCount[0], fieldValueDic, null, null);
}
}

else
{
txtHitCount.Text
= "1";
Dictionary
<string, object> fieldValueDic = new Dictionary<string, object>();
fieldValueDic[
"Title"] = HtmlPage.Document.DocumentUri.ToString();
fieldValueDic[
"HitCount"] = 1;
clientProxy.CreateListItemAsync(
"Hit Count", fieldValueDic, null, null);
}
}


private void OnRequestSucceeded(Object sender, ClientRequestSucceededEventArgs args)
{
Dispatcher.BeginInvoke(BindData);
clientProxy.Dispose();
}


private void OnRequestFailed(Object sender, ClientRequestFailedEventArgs args)
{
clientProxy.Dispose();
}

  邏輯比較簡單,這里就不詳細解釋了。在App.xaml.cs中的Startup事件中添加讀入參數的方法:

 
private void Application_Startup(object sender, StartupEventArgs e)
{

string siteUrl = e.InitParams["SiteUrl"];
siteUrl
= System.Windows.Browser.HttpUtility.UrlDecode(siteUrl);
this.RootVisual = new MainPage(siteUrl);
}

  OK,build一下,先在客戶端調試一下,這里注意了,如果你機器安裝過360的瀏覽器的話,那么有可能調試的時候無法進入斷點,保險的方法還是將IE設置為默認瀏覽器,然后調試。

  5、將生成的.xap文件上傳到SharePoint2010的一個Document library中,在任意一個你想統計訪問次數的頁面上Add web part,選擇Silverlight web part,在url中添加xap上傳的路徑,然后在Other Settings中添加外部傳入參數,形式為SiteUrl = hit count list 所屬site的url。

  完成以后,可以看見頁面上已經有了訪問次數統計了:

  這里只是簡單的創建了一個頁面次數訪問的統計器,關鍵還是熟悉了SharePoint2010下Silverlight的客戶端訪問模型,歡迎大家討論。

0
0
 
標簽:Silverlight
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()