使用properties和SPContext时须小心

原文地址:http://ayman-elhattab.blogspot.com/2008/09/be-careful-when-using-properties.html

什么是SPContext?
用一句话概括,SPContext对象可用于从当前上下文中获取一个site或web的引用,可以看作是一个对SharePoint的HTTP请求的上下文。

例如:
SPList currentList = SPContext.Current.List;
SPWeb currentSite 
= SPContext.Current.Web;
SPSite currentSiteCollection 
= SPContext.Current.Site;
SPWebApplication currentWebApplication 
= SPContext.Current.Site.WebApplication;
SPListItem item 
= (SPListItem)SPContext.Current.Item;
SPUser user 
= SPContext.Current.Web.CurrentUser;


什么是“Properties”?
properties对象包含了某个特定事件的信息,可以用来获取到该事件相关的SPSite,SPWeb,SPList或SPListItem的引用。
例如:

SPListItem item=properties.ListItem;

然而,当使用properties参数或SPContext时一定要非常小心。你不能用properties来创建你的对象,否则代码将出错。正确的用法是通过properties或SPContext来定位条目,然后用条目ID号来创建对象的引用。否则你的代码总是会出现这样那样的问题。
你需要在进入权限提升代码块(RunWithElevatedPriveleges)或模拟用户前获取所有会用到的Guid标识,然后在安全上下文中再创建处所有你需要的对象。
如下所示:

Guid SiteId = SPContext.Current.Site.ID;
Guid WebId 
= SPContext.Current.Web.ID;
Guid ListId 
= properties.ListId;
Guid UniqueId 
= properties.ListItem.UniqueId;
SPSecurity.RunWithElevatedPrivileges(
delegate()
{
using (SPSite site= new SPSite(SiteId))
{
using (SPWeb web= site.AllWebs[WebId])
{
SPList list
= web.Lists[ListId];
SPListItem listItem
= list.Items[UniqueId];
// Code..
}
}
});

或者通过SPUserToken来模拟系统帐户(推荐这种写法

Guid SiteId = SPContext.Current.Site.ID;
Guid WebId 
= SPContext.Current.Web.ID;
Guid ListId 
= properties.ListId;
Guid UniqueId 
= properties.ListItem.UniqueId;
SPUserToken systemAccountToken 
= SPContext.Current.Site.SystemAccount.UserToken;
using(SPSite mySite = new SPSite(SiteId, systemAccountToken))
{
using (SPWeb myWeb = mySite.OpenWeb(WebId))
{
SPList list
= web.Lists[ListId];
SPListItem listItem
= list.Items[UniqueId];
// Code..
}
}
posted @ 2010-02-08 14:01 RickyYan 阅读(29) 评论(0) 编辑

 

 

转载:http://blog.csdn.net/RainyLin/archive/2009/01/15/3789922.aspx

 

我们知道,存储在数据库里的SharePoint页面是不能直接添加后台代码的,这给我们带来了很多的不方便,比如想要在页面上实现一些东西,都必须使用Webpart或者自定义控件的方式,哪怕仅仅是很简单的几行后台代码。而WSS 3.0 是基于ASP.NET 2.0的,在ASP.NET站点里使用的任何技术在WSS站点里同样可以使用。因此我们同样可以给WSS站点的页面添加后台代码。

存储在数据库中的sharepoint页面分为两部门,母板页和内容页,我们可以为这两种页面分别添加后台代码。实现方式不一样,若为内容页添加后台代码,我们需要继承自Microsoft.SharePoint.Publishing.PublishingLayoutPage类,若为母板页添加后台代码,我们需要继承自System.Web.UI.MasterPage类,你应该将后台代码类与对应页面设置成相同的名字,但这不是必须的。如下所示:
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Publishing;
using Microsoft.SharePoint.WebControls;
namespace AA{
public class AAClass: PublishingLayoutPage {
}
}
     这样我们就可以为页面上的控件添加相应的后台代码。比方说我们的页面上有一个按钮和一个文本框,ID分别为textbox1和button1,并为button添加一个ckick事件,当点击按钮时,将当前时间写入文本框中,可以这么来写:
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Publishing;
using Microsoft.SharePoint.WebControls;
namespace AA
{
public class AAClass: PublishingLayoutPage
 {
   protected TextBox textbox1;
        protected Button button1;
   protected override void OnInit(EventArgs e)
      {
            base.OnInit(e);
            button1.Click += new EventHandler(button1_Click);
        }
}
void button1_Click(object sender, EventArgs e)
{
     textbox1.Text = DateTime.Now.ToString();
}
}
   在MOSS的页面上,服务器控件分为ASP控件(命名空间System.Web.UI.WebControls)和sharepoint控件(命名空间是Microsoft.SharePoint.WebControls),我们同样可以声明sharepoint控件并为它们添加相应的操作。
写好我们的后台代码后,将代码生成到对应的bin目录下(或者GAC,记得强命名),在web.config文件中添加一行,<SafeControl Assembly="" Namespace="" TypeName="*" Safe="True" />,其中assembly和namespace可以通过reflector获得,然后我们还需要在页面上重写页:
<%@ Page meta:progid="SharePoint.WebPartPages.Document" Language="C#" Inherits="MossCodeBehind.CodeBehind,MossCodeBehind, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" %>
如果是母板页,这样添加
<%@ Master language="C#" Inherits=" MossCodeBehind.CodeBehind,MossCodeBehind, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" %>

不过重写了之后,就不能在设计窗口中打开页面了。

通过这种方式,开发者就可以在像ASP.NET中一样做开发,例如我们可以重写onload事件来实现向页面的控件绑定数据。
有兴趣的朋友可以尝试一下,能满足我们很多的需求。

 

posted @ 2010-02-05 10:41 RickyYan 阅读(220) 评论(0) 编辑

使用方法:
例:
/**正整数匹配表达式*/
var pattern=/^[0-9]*[1-9][0-9]*$/;
var flag = pattern.test(a);
如果a是正整数,flag的boolean值为true,如果a不是正整数,flag的boolean值为false。



/**浮点数匹配表达式*/
var pattern = /^([-]){0,1}([0-9]){1,}([.]){0,1}([0-9]){0,}$/;

/**浮点数匹配表达式且只保留两位小数*/
var pattern=/^-?\d+[\.\d]?\d{0,2}$/;

/**正浮点数匹配表达式*/
var pattern=/^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;

/**正浮点数且保留两位小数匹配表达式*/
var pattern=/^(([1-9]\d*(\.\d?[0-9])?)|(0\.[1-9][0-9])|(0\.[0][1-9]))$/;

/**负浮点数匹配表达式*/
var pattern=/^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;

/**负浮点数且保留两位小数匹配表达式*/
var pattern=/^-(([1-9]\d*(\.\d?[0-9])?)|(0\.[1-9][0-9])|(0\.[0][1-9]))$/;

/**负浮点数+0 匹配表达式*/
var pattern=/^((-\d+(\.\d+)?)|(0+(\.0+)?))$/;

/**负浮点数+0 并且保留两位小数匹配表达式*/
var pattern=/^((-\d+[\.\d]?\d{0,2})|(0+(\.0+)?))$/;

正浮点+0匹配表达式
var pattern = /^\d+(\.\d+)?$/;

/**正浮点+0匹配表达式且只保留两位小数*/
var pattern=/^\d+[\.\d]?\d{0,2}$/;

/**整数匹配表达式*/
var pattern=/^-?\d+$/;

/**正整数匹配表达式*/
var pattern=/^[0-9]*[1-9][0-9]*$/;

/**负整数匹配表达式*/
var pattern=/^-[0-9]*[1-9][0-9]*$/;

/**正整数+0 的匹配表达式*/
var pattern=/^\d+$/;

/**负整数+0 的匹配表达式*/
var pattern=/^((-\d+)|(0+))$/;

/**全是数字匹配表达式*/
var pattern=/^[0-9]{1,20}$/

posted @ 2009-03-16 14:25 RickyYan 阅读(1325) 评论(0) 编辑

今天又遇到一个奇怪的问题。

MOSS站点中有一个公司新闻列表库,新闻内容通过MOSS自己的HTML编辑器进行编辑,我在中间插入了该站点下一个图片库的一张图片。

我的需求是将新闻内容中HTML模式下图片库的地址替换成其它地址:

就是上图中的“http://moss.qt.cmcc/InfomationManagement/NewsImg”我想替换成其它字符串。

我的代码就是直接用replace方法将两个字符串替换,可总是替换不掉,很是烦恼。

最后通过代码将HTML内容输出才明白,原来通过对象模型取出来的地址就变了,把首站点的地址去掉了,退为“/InfomationManagement/NewsImg”

replace方法中替换这个字符串替换成功。

posted @ 2009-03-10 16:21 RickyYan 阅读(24) 评论(0) 编辑

今天我的同事解决了一个很奇怪的问题。

我们的MOSS站点首页总是登陆后再点刷新的时候总是再次弹出登陆确认框,很是奇怪,经过研究最后发现是有一个自己写的WebPart中调用了一个服务器端的CSS文件,但那个CSS文件的查看权限只有管理员,把该文件的读取权限放开就没有问题了。

posted @ 2009-03-10 16:07 RickyYan 阅读(55) 评论(0) 编辑
posted @ 2009-03-06 14:59 RickyYan 阅读(872) 评论(0) 编辑
posted @ 2009-03-05 14:26 RickyYan 阅读(763) 评论(1) 编辑
posted @ 2009-02-25 20:19 RickyYan 阅读(44) 评论(0) 编辑