设为首页 收藏本站
查看: 759|回复: 0

[经验分享] [SharePoint 2010]一个Silverlight的网页访问计数器

[复制链接]

尚未签到

发表于 2015-9-24 09:38:58 | 显示全部楼层 |阅读模式
  大家知道,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访问采用异步的方式,所以几个基本的操作方法如下
  

DSC0000.gif DSC0001.gif 代码

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。
  完成以后,可以看见页面上已经有了访问次数统计了:
DSC0002.jpg
  这里只是简单的创建了一个页面次数访问的统计器,关键还是熟悉了SharePoint2010下Silverlight的客户端访问模型,欢迎大家讨论。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118050-1-1.html 上篇帖子: SharePoint 2013 之 Web App 2013 下篇帖子: SharePoint 2010工作流系列(4):初窥Visual Studio 2010的SharePoint工作流功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表