探索与发现

研究java技术

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  83 随笔 :: 0 文章 :: 109 评论 :: 0 Trackbacks

#

webpart拉到界面上后,有五种部件版式布局方式:默认;无;标题和边框;仅边框;仅标题。
为了方便布署,我们希望在写webpart的时候就指定一种布局方式,以免在布署到页面的时候再去改为自己想要的方式。
那么,我们应该如何做呢?
其实相当简单,
只需要在webpart的构造函数中注明想要的布局方式就行了。
代码如下:
this.ChromeType = PartChromeType.None;    //无
this.ChromeType = PartChromeType.BorderOnly;    //仅边框
this.ChromeType = PartChromeType.TitleAndBorder;    //标题和边框
this.ChromeType = PartChromeType.TitleOnly;    //仅标题
this.ChromeType = PartChromeType.Default;    //默认
posted @ 2009-05-16 06:47 蜘蛛 阅读(300) | 评论 (0)编辑 收藏

http://bbs.blueidea.com/thread-2826016-1-1.html

override protected void OnInit(EventArgs e)
    {
this.btn1.Command  = new CommandEventHandler(this.DoBtnClick);
}
public virtual void DoBtnClick(object sender, CommandEventArgs e)
    {
string btn= e.CommandArgument.ToString();
switch(btn){}

}
posted @ 2009-05-15 08:16 蜘蛛 阅读(201) | 评论 (1)编辑 收藏

http://www.likespc.cn/Article/654.html
posted @ 2009-05-15 08:15 蜘蛛 阅读(174) | 评论 (0)编辑 收藏

本文介绍如下几个方面的内容:

1.如何创建数组

2.如何对数组进行操作(添加,删除,读取)

3.数组常见方法和属性

如何创建一个数组,一般地根据初始化设定简单分为3种:

1.单纯创建数组:

var arr=new Array();

要点:用new关键字创建数组对象Array(),Array()对象是一个本地类,可以用new创建一个对象后使用

2.创建数组的同时规定数组大小:

var arr=new Array(10);//这里就创建了一个初始化大小为10的数组

注意:当使用数组大小操作初始化大小时,数组会自动被撑大,不会像C语言那样发生错误.动态增长是js数组的一个性质.另外,js中支持最大数组长度为

4294967295

3.直接初始化:

var arr=new Array("love","hate","pain");//这里就直接初始化了数组

或var arr=["happy","cute","scare"];//括号也可以声明一个数组对象

当然,类似C语言,可以定义2维3维和多维的数组,例如:

<script language=Javascript>

    var myArray = new Array();

    for(var i=0;i<10;i++ )...{

        myArray[i]=new Array();

        myArray[i][0]=Math.floor(Math.random()*10);

        myArray[i][1]=Math.floor(Math.random()*10);

        myArray[i][2]=Math.floor(Math.random()*10);

        myArray[i][3]=Math.floor(Math.random()*10);

        myArray[i][4]=Math.floor(Math.random()*10);

        myArray[i][5]=Math.floor(Math.random()*10);

        myArray[i][6]=Math.floor(Math.random()*10);

        myArray[i][7]=Math.floor(Math.random()*10);

        myArray[i][8]=Math.floor(Math.random()*10);

    }

   

    myArray.sort( function(x, y) ...{

        return (x[0]==y[0])?((x[4]==y[4])?(x[8]-y[8]):(x[4]-y[4])):(x[2]-y[2])

    });

    for(var i=0;i<myArray.length;i++ )...{

        document.write(myArray[i].join(",") + "<br/>");

    }

</script>

数组的属性:length

arr.length返回数组arr的长度,常见于循环中对数组的遍历,比如:

for(var i=0;i<arr.length;i++){

执行部分

}

数组元素的访问: arr[index],其中index表示索引即数组基数,从0开始,共有arr.length个元素.比如: arr[0]访问第一个数组元素,arr[1]访问第二个数组元素....依

次类推 数组的操作方法:先概览下下面的这些操作数组常用的方法(13个)

toString(),valueOf(),toLocalString(),join(),split(),slice(),concat(),

pop(),push(),shift(),unshift(),sort(),splice()

下面逐一分析这些方法的功能和用法.

toString(),valueOf(),toLocalString():

功能:返回数组的全部元素

注:数组名也可以返回整个数组

代码:

    var m=["am","bm","cm"];//用括号声明一个数组对象

    alert(m.toString());//toString()返回数组对象的所有内容,用逗号分割,即am,bm,cm

    alert(m.valueOf());//valueOf()也返回数组对象的所有内容

    alert(m.toLocaleString());//toLocaleString()也返回数组对象的所有内容,但有地区语言区别,暂不研究

    alert(m);//数组名也返回数组对象的所有内容

join():

功能:把数组各个项用某个字符(串)连接起来,但并不修改原来的数组

代码:

    var m=["am","bm","cm"];//用括号声明一个数组对象

    var n=m.join("---");//用---连接am,bm,cm.

    alert(m.toString());//m并没有被修改,返回am,bm,cm

    alert(n);//n是一个字符串,为am---bm---cm

split():

功能:把一个字符串按某个字符(串)分割成一个数组,但不修改原字符串

代码:

    var str="I love maomao,I am caolvchong";

    var arr=str.split("o");//按字符o把str字符串分割成一个数组

    alert(arr);//输出整个数组

slice():返回某个位置开始(到某个位置结束)的数组部分,不修改原数组

代码:

    var m=["am","bm","cm","dm","em","fm"];

    var n=m.slice(2);//返回第二个元素bm后面的元素,即cm,dm,em,fm

    var q=m.slice(2,5);//返回第二个元素后到第五个元素,即cm,dm,em

    alert(n);

    alert(q);

数组对象的栈操作:

push():数组末尾添加一个项

pop():删除数组最后一个项

代码:

    var m=["am","bm","cm","dm","em","fm"];

    m.push("gm");//在数组末尾添加元素gm

    alert(m);

    m.pop();//删除数组最后一个元素gm

    alert(m);

数组对象的队列操作:

unshift():数组头添加一个项

shift():删除数组第一个项

代码:

    var m=["am","bm","cm","dm","em","fm"];

    m.unshift("gm");//在数组第一个元素位置添加元素gm

    alert(m);

    m.shift();//删除数组第一个元素gm

    alert(m);

sort():数组按字符的ASCII码进行排序,修改数组对象

注:即便是数字数组,也将转化为字符串来进行比较排序

代码:

    var m=["am","fm","gm","bm","em","dm"];

    m.sort();//按字母序排序

    alert(m);

concat():在数组尾添加元素,但不修改数组对象

代码:

    var m=["am","bm"]

    var n=m.concat("cm");//添加一项cm,并且赋予新数组对象

    alert(m);//原数组没有被修改

    alert(n);//输出新数组对象

splice():在数组的任意位置进行添加,删除或者替换元素,直接修改数组对象

细节:

splice()有三个参数或三个以上参数,前两个是必须的,后面参数是可选的

进行添加:splice(起始项,0,添加项)

进行删除:splice(起始项,要删除的项个数)

进行替换:splice(起始项,替换个数,替换项) 这个其实是添加删除的共同结果

代码:

    var m=["am","bm"]

    m.splice(1,0,"fm","sm");//在第一项后面添加fm和sm,返回am,fm,sm,bm

    alert(m);

    m.splice(2,1);//删除第二项后面一项(即第三项sm,返回am,fm,bm)

    alert(m);

    m.splice(2,1,"mm");//替换第二项后面一项(即第三项,返回am,fm,mm)

    alert(m);





在有的教程上没有提到数组对象,都用自定义的数组,没提到的大概都是老版本了:

//定义一维数组
function MArray(len){
this.length = len;
for(i=1;i<=len;i++) this[i] = 0;
return this;
}
//创建数组
var strarray = new MArray(9)
//访问数组
for(aint in strarray) document.write(aint + ":" + strarray[aint] + "<br>");


//定义二维数组
function creatMArray(row,col){
var indx=0;
this.length=(row*10)+col
for(var x=1;x<=row;x++)
for(var y=1;y<=col;y++){
indx=(x*10)+y;
this[indx]="";
}
return this;
}
//创建二维数组
var xarr = new creatMArray(11,2)
//访问二维数组
for (x in xarr) document.write(x + ":" + xarr[x] + "<br>")
posted @ 2009-05-14 08:18 蜘蛛 阅读(193) | 评论 (2)编辑 收藏

http://jlbc.skycn.com/down/HA-daemon4303.zip
posted @ 2009-05-13 21:32 蜘蛛 阅读(166) | 评论 (0)编辑 收藏

ASP.NET Ajax中的UpdatePanel和asp.net中FileUpload控件是不兼容的,但是采用下面的方法,可以在ASP.NET+Ajax下实现文件上传
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
     <Triggers>
     <asp:PostBackTrigger ControlID="btnUpload" />
     </Triggers>
<ContentTemplate>
<asp:FileUpload ID="FileUpload1" runat="server" Width="400px" />
<asp:Button ID="btnUpload" runat="server" Text="上传" OnClick="btnUpload_Click" />
</ContentTemplate>
</asp:UpdatePanel>
把提交上传文件的按钮放在<Triggers>标签内,而不放在<ContentTemplate>中,特别注意把UpdateMode设为Conditional。然后在btnUpload_Click方法中执行保存文件和写入数据库的操作。当然这样做,上传文件时就失去了异步交互的效果,但是,在执行其它操作的时候,都还是有Ajax特性的。另外,如果您的这个上传文件的页面使用了一个母版页,并且在母版页中有一个UpdatePanel,在母版页中对子页的控件加上<Triggers>是不行的,还好,UpdatePanel是可以嵌套的。




方案一、如果将scriptmanager的enablepartialrending设为false则可以正确上传,这个方法最简单,但是会有缺陷,就是在同一个页面上的多个UpdatePanel不可以独自刷新了。另外,当你的UpdatePanel中存在Validator的话,会造成整个页面postback,这个问题似乎是Altas的一个bug.

方案二、摘自http://www.netfocus.cn/article950.html

1:主页面中使用UpdatePanel,然后UpdatePanel里面放置的不是FileUpload控件,而是一个Iframe
2:这个iframe在链接一个新的页面,那个页面里面有FileUpload控件。
3:上传完毕后,告诉主页面上传得结果

先看一个直接使用FileUpload的例子:这个例子里面,服务端是无法找到上传文件的。

            <atlas:UpdatePanel ID="up1" Mode="Conditional" runat="server">
                
<ContentTemplate>
                    
<asp:FileUpload ID="FileUpload1" runat="server" />
                    
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
                 
< SPAN>ContentTemplate>
            
< SPAN>atlas:UpdatePanel>


看看,我们该如何实现
1:新建主页面Default.aspx
      在适当的位置,放置一个上传附件的UpdatePanel区域
     

            <atlas:UpdatePanel ID="up_attachment" Mode="Conditional" runat="server">
                
<ContentTemplate>
                   
<iframe id="file" name="file" src="attachment.aspx">< SPAN>iframe>
                
< SPAN>ContentTemplate>
            
< SPAN>atlas:UpdatePanel>

2:新建上传文件的页面attachment.aspx,然后放上FileUpload控件

<div>
    
<asp:FileUpload ID="FileUpload1" runat="server" />
          
<asp:Button ID="Button1" runat="server" Text="OK" OnClick="Button1_Click" />
    
< SPAN>div>

3:在attachment.aspx里面,上传文件之后调用主页面的js,报告上传情况。这是函数原型:

    <script>
      window.top.callBack(fileName);
    
< SPAN>script>

4:Default.aspx主页面里面增加这个函数,处理返回值
  

    <script>
     function callBack(fileName)
  
{
        document.getElementById(
'Attach1').innerHTML=fileName;
     }

    
< SPAN>script>
posted @ 2009-05-13 21:31 蜘蛛 阅读(3613) | 评论 (2)编辑 收藏

SPSecurity.RunWithElevatedPrivileges(delegate()
{
// implementation details omitted
});

可以提升代码的运行权限,实现模拟管理员身份的功能。

在RunWithElevatedPrivileges中不要使用 SPContext.Current.Web,SPContext.Current.Site,SPControl.GetContextWeb(HttpContext.Current) 之类的根据当前上下文得到当前的Web或者Site,根据这些方法得到的所有对象(包括从根据这些对象得到的List,ListItem等等对象)都是以 当前网站登录用户权限运作的,即使是在RunWithElevatedPrivileges其运作权限也不会是管理员。

所以,如果要真正让在RunWithElevatedPrivileges中的代码以管理员权限正常运作的话,必须重新初始化相应的对象,比如:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite mySite = new SPSite(SPContext.Current.Site.Url))
{
Response.Write(mySite.RootWeb.CurrentUser.LoginName);
}
});
以上mySite.RootWeb.CurrentUser.LoginName返回的是管理员的登录帐号。
但是如果按之前所说使用SPContext:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
Response.Write(SPContext.Current.Web.CurrentUser.LoginName);
});

这时候即使在提升权限的范围内运行,得到的也是当前网站登录帐户名,而不是管理员登录帐号

public class DemoHandler : SPItemEventReceiver //继承SharePoint数据条目事件监控类
{
    
public override void ItemAdded(SPItemEventProperties properties)  //重载ItemAdded函数,监控新建列表条目事件
    {
         SPSecurity.RunWithElevatedPrivileges(
delegate()      //用此方法模拟管理员账户运行此事件处理程序
        {
            
using (SPSite site = new SPSite(properties.SiteId))    //用此方法的话就不用dispose()了
            {
                
using (SPWeb web = site.OpenWeb(properties.OpenWeb().ID))  //注意获得web的方法!!!
                {
                    
try
                    
{
                         SPList list
= web.Lists[properties.ListId];     //获得触发事件的列表
                         SPListItem item = list.Items.GetItemById(properties.ListItemId);    //获得触发事件的列表条目

                        
if (!item.HasUniqueRoleAssignments) item.BreakRoleInheritance(false);   //将此条目取消权限继承,如果是“false”,则将去除所有权限,只保留系统账户,如果是“true”,则将上一级权限复制过来。
                         SPUser user = web.Users.GetByID(properties.CurrentUserId);    //获得触发此事件的用户

                         SPRoleAssignment ra
= new SPRoleAssignment(web.EnsureUser(user.LoginName));   //生成一个新的角色分配
                         ra.RoleDefinitionBindings.Add(web.RoleDefinitions["读取"]);    //将此角色分配绑定“读取”权限级别
                         item.RoleAssignments.Add(ra);     //将此新权限绑定到列表条目上
                     }

                    
catch (Exception ee)
                    
{
                     }

                 }


              }

         }

         );
     }

}

posted @ 2009-05-13 07:37 蜘蛛 阅读(858) | 评论 (1)编辑 收藏

 
8月25日

关于Windows Sharepoint Server的权限内容分析

首先声明这个领域小弟也是刚涉足, 经验浅的很. 一些看法和说法都是卑微之语. Windows Sharepoint Server中的权限(Authorization)设置是通过中间件角色(Role)来与指定用户(User)发生关系的. 并不如同传统的直接给予某个用户相应的权限. 即应该通过创建一个角色然后在其中组合不同的权限最后将一个角色赋予一个用户. 用户组的概念也是如此.  User/Group -- Role --Authorization
无论当你是将一个用户或者组添加入对于某个列表或者某个文件中获得相应的权限. 那些关于用户和用户组的信息分配存放在配置数据库的UserInfo和Groups表中. 其中tp_siteId代表了所属站点的ID, tp_Id则是分配给用户的ID, Groups的组织方式也基本和UserInfo差不多.  Role 即角色表, 存放所创建的角色. RoleAssignment存放角色的分配. 其中的ScopeId 会对应Perms表中的ScopeId, 当你为一个列表或者某个文件添加权限时并且不继承父权限的时候, 在Perms表中会添加相应的新记录内容, 并且创建它的ScopeUrl与ScopeID来标识它.  并且与RoleAssignment中的scopeId对应, 而RoleAssignment中的PrincepalId则存放对应的UserInfo中的tp_Id或者Groups中的tp_Id. 两张表中的tp_Id是不会重复的. 搞清楚了权限组合和角色创建与分配是如何组成的. 现在来看一下如何通过Windows Sharepoint Server的对象模型以编程方式解决一些问题. 比如我想通过一个EventHandler当用户上传某个文件以后让他选择相应的本地域中已存的AD帐户.
实现Windows Sharepoint Server的EventHandler有两种方式(暂时只了解两种), 一种是实现IListEventSick接口. 这种方式的缺点暂时令我感觉到的是很难做一些更复杂的操作.  另一种方式是派生相应的操作时间类. 如果是一些内容则是SPItemEventReceiver.  具体内容可以通过Reflector反射Microsoft.Sharepoint.dll了解. 可以重写其中的实现方法来实现我们需要的功能. 现在要编写一个添加完Item后执行的权限分配操作. 也就是当用户在文档中心上传完一个文件以后, 将一个指定的用户添加入其中获得该文件的相应权限.
public override void ItemAdded(SPItemEventProperties properties){}
通过SPItemEventProperties我们可以获得不少关于触发事件的Item的信息. 如SiteId(站点ID),  ListId(列表ID), ListItemId(列表项ID).  比如我要访问那个刚上传文档的对象可以通过以下方式:
SPSite sourceSite = new SPSite(properties.SiteId);
SPWeb sourceWeb = sourceSite.OpenWeb();
SPListItem currentListItem = sourceWeb.Lists[properties.ListTitle].Items.GetItemById(properties.ListItemId);
每个列表条目都提供一个角色分配集合RoleAssignments属性, 它是一个Collection. 提供基本的操作方法. 利用Add我们则可以添加相应的新的RoleAssignment元素.
我们通过建立一个RoleAssignment的实例来添加用户:
SPRoleAssignment roleAssignment = new SPRoleAssignment(sourceWeb.EnsureUser(SHBEYONDBIT\chujun));
SPRoleDefinition roleDefinition = sourceWeb.RoleDefinitions.GetByType(SPRoleType.Read);
SPRoleType 是一个enum提供默认角色级别
SPRoleType.Administrator = 完全控制
SPRoleType.WebDesigner = 设计
SPRoleType.Contributor = 参与讨论
SPRoleType.Reader = 读取
SPRoleType.Guest = 受限访问
SPRoleType.None = 仅查看
对于我们自己创建的Role则不提供支持. 我们需要通过其它方式来获得. 通过RoleDefinitionBindings属性的Add方法我们添加了一个Role给予指定的用户.
roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
currentListItem.BreakRoleInheritance(false);
BreakRoleInheritance就如同我们手动设置用户角色时选择的是否不在继承父权限一样. 我们不再继承父权限. 最后通过currentListItem.RoleAssignments.Add(roleAssignment); 为相应列表添加了某个用户的角色.
在这里有一点令人有些费解, 起初我并非用EnsureUser方法实现用户添加的, 而是通过SPUserInfo创建一个实例. 将AD帐号的一些信息写入其中. 然后通过sourceWeb.User.Add方法来实现添加, 可惜屡屡报错说当前状态无效. 不知有哪位高人知道为何? 不吝赐教.
现在在来讨论关于如何自定义角色问题. 在Windows Sharepoint Server中提供了相当多的权限. 并且通过SPBasePermissions这个enum来设定. 其实实现的方式大致应该是一个int类型. 然后相应的位放置1来确定吧. 即以一个unsigned short为例 00100100可能代表某个Role拥有未知的两个权限.
SPRoleDefinition definition = new SPRoleDefinition(); 创建角色定义的实例.
public bool AddSiteRole(string name, string description, params SPBasePermissions[] args){
     bool flag = true;
     SPRoleDefinition definition = new SPRoleDefinition();
     definition.Name = name;
     definition.Description = description;
     foreach (SPBasePermissions arg in args){
          definition.BasePermissions |= arg;
     }
     try{
          _sourceWeb.RoleDefinitions.Add(definition);
     }
     catch{
          flag = false;    
     }
     return flag;
}
进行相应位置的|操作就可以分配相应的权限了. 如下:
AddSiteRole("自定义角色1", "自定义角色1", SPBasePermissions.AddAndCustomizePages, SPBasePermissions.AddDelPrivateWebParts, SPBasePermissions.AddListItems, SPBasePermissions.ApplyStyleSheets);
顺带一提, 因为SPUser和SPGroup都派生于SPPrincipal, 而SPRoleAssignment可以接受任何派生与SPPrincipal的类型进行添加. 想想之前数据表RoleAssignment表中的PrincepalId, 在真挺有逻辑的.
 
最近有一个项目是针对基于Windows Sharepoint Server, 并利用Microsoft Office Sharepoint Server2007和Design的开发和部署(其实我对这个项目是颇有微辞的, 首先对于这类技术的集成还没有掌握, 项目书上说是配置占70%以上, 其实不然以这样的要求显然开发占了70%以上). 并且我对这种Microsoft极度推崇的技术也是心存一些不满的. 首先它的内容更广一些,不仅设计了Windows WorkFlow Fundation, Web  Part, ASP.NET 2.0, CAML, Infopath以及Windows Sharepoint Server等大量内容还有许多企业应用的概念. 并与Office系列产品有高度集成. 这对于一个开发人员来说需要掌握更多的技术特性. 其实光是精通其中两样已经是很不容易的一回事了. 基于它的二次开发难度较大, 并且许多默认提供用户的操作方式都不是传统的Web用户操作习惯. 说穿了只是Microsoft想要捆绑它的一整套产品销售, 卖给那些政府或者大型企业而已. 哎! 感叹做为开发人员, 不是每个项目都能选择让你使用你擅长的喜爱的技术.
 
不知道有谁会在上传完文件以后先不跳往那个定义名字和注释的页面, 而是跳往我想指定的页面. 因为在Windows Sharepoint Server的那些上传之类的都是以做完的模板, 可能有些按钮时间是自定义的控件. 比如像那些SPWikiButton一类. 以完全将处理方法封装起来了. 除非直接修改页面上脚本. 但是这类都是模板无法如同那些其它的Default.aspx或者Default.Master那样进行修改. 而也无法获得所谓的窗体句柄. 如有实现方式请不吝赐教.
posted @ 2009-05-13 07:35 蜘蛛 阅读(558) | 评论 (0)编辑 收藏

Sharepoint2007中的权限都是通过角色来定义的,一切权限都是通过权限来设置,在设置权限的时候,只能给用户或组赋予一个角色,而不能直接去修改他的权限。
每一个能分配权限的对象(SPWebSPListSPListItem)都会有一个RoleAssignments属性,它是一个SPRoleAssignmentCollection类型的属性,用于分配权限。此外,在SPWeb里还有RoleDefinitions属性(只在SPWeb里有,角色只能定义在网站里)。

1.给一个用户设置一个详细的自定义的权限:
SPUser user ;//取得Sharepoint用户
SPRoleAssignment myRoleA =
new SPRoleAssignment(user);
SPRoleDefinition myRoleD = web.RoleDefinitions["xxx"];
myRoleA.RoldDefinitionBindings.Add(myRoleD);
list.RoleAssignments.Add(myRoleA);

2.修改一个用户的权限:
SPRoleAssignment myRoleA = list.RoleAssignments.GetAssignmentByPrincipal(user);
SPRoleDefinition myRoleD = web.RoleDefinitions["xxx"];
myRoleA.RoldDefinitionBindings.Add(myRoled);
myRoleA.Update();

如果该列表的权限是继承该网站的,那么要首先打破这种继承关系
list.BreakRoleInheritance(true/false);
参数是true将网站中的权限拷贝过来和原来的权限是一样的,如果是false则为列表模板的默认权限。

SPListItem item = properties.ListItem;
SPWeb web = properties.OpenWeb();
SPUser user = web.EnsureUser((new SPFieldLookupValue(item["Test"].ToString())).LookupValue);
SPUser chris = web.EnsureUser((new SPFieldLookupValue(item["chris"].ToString())).LookupValue);
SPUser henry = web.EnsureUser((new SPFieldLookupValue(item["Personalabteilung"].ToString())).LookupValue);
SPRoleDefinition roleReader = web.RoleDefinitions.GetByType(SPRoleType.Reader);
SPRoleDefinition roleWriter = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
SPRoleAssignment roleAssignmentReader = new SPRoleAssignment((SPPrincipal)user);
SPRoleAssignment roleAssignmentWriter = new SPRoleAssignment((SPPrincipal)
chris );
SPRoleAssignment roleAssignmentWriterOther = new SPRoleAssignment((SPPrincipal)
henry );
roleAssignmentReader .RoleDefinitionBindings.Add(roleReader);
roleAssignmentWriter .RoleDefinitionBindings.Add(roleWriter);
roleAssignmentWriterOther .RoleDefinitionBindings.Add(roleWriter);
if (!item.HasUniqueRoleAssignments)

{

     item.BreakRoleInheritance(false);

}

item.RoleAssignments.Add(roleAssignmentReader);
item.RoleAssignments.Add(roleAssignmentWriter);
item.RoleAssignments.Add(
roleAssignmentWriterOther );
item.Update();


posted @ 2009-05-13 07:13 蜘蛛 阅读(453) | 评论 (1)编辑 收藏

基于Sharepoint做一个客户管理的系统,由于客户方对权限的要求非常严格,所以不得不自己去定义网站的权限,好在Sharepoint提供的权限系统比较完善,我们所创建的权限包括从创建SPWeb到创建SPListItem均实现了一遍,也算是顺利的解决了问题。项目做到第一阶段,谈谈自己的一些认识。

 

在开始之前先明确几个类或者定义:

Sharepoint权限系统采用 权限——角色 ——对象——关联 的概念,即:对于一个对象(如:SPWeb,SPList,SPListItem),可以通过添加某个已经包含了角色(SPRoleDefinition)的关联(SPRoleAssignment)而更改该对象的权限,而角色(SPRoleDefinition)则是提前通过SPWeb.RoleDefinitions添加到网站内的,注意:只有SPWeb有此属性可以添加角色定义,其他对象如SPSiteSPListSPListItem均不能添加角色定义,当然他们也不需要。

 

相关类:

 

用户或用户组:SPPrincipal 扩展了两个子类:SPUserSPGroup

权限基类:SPBasePermissions,通过或计算合成一个自定义的权限,注意:需要编辑权限的前提是有查看权限;

角色类:SPRoleDefinition,采用web.RoleDefinitions.Add(definition)的方式添加角色;

关联类:对于某个SPPrincipal添加一个SPRoleDefinition的角色,然后再将该关联添加到对象上去,注意:在未将该关联添加到对象上时,该关联都无效。

 

首先定义自己的权限系统,我定义了四个级别的角色,本别具有权限:查看、新建、编辑、删除,这四个权限要远低于Sharepoint本身的权限,这里以新建角色为例说明: 同时定义了负责向网站添加角色Register类,每一个角色都会对应一个Register类,是为了方便权限的扩展,采用依赖倒置。

为对象分配权限:参数SPListItem 也可以是 SPWebSPList,权限的分配一般是在对象刚刚创建后来实现,如

SPWebTemplate template = web.Site.GetCustomWebTemplates((uint)web.Locale.LCID)[WebTemplate];

SPWeb newWeb = RootSPWeb.Webs.Add(rurl, customerName, string.Empty, (uint)2052, template, true, false);

此时就应该对该newWeb做权限操作。而SPListItem的操作一般是在SPItemEventReceiver的ItemAdded事件中去实现


private void RoleAssignment(SPListItem item, SPPrincipal groupOrUser, SPRoleDefinition role)
        {
        
if (!item.HasUniqueRoleAssignments)
        {
            item.BreakRoleInheritance(
true);//true则断开并继承原有权限,false则断开不继承原有权限
        }
        
            
            
this.DisableEventFiring();

            item.Web.AllowUnsafeUpdates 
= true;

            SPRoleAssignment assignment 
= new SPRoleAssignment(groupOrUser);
            assignment.RoleDefinitionBindings.Add(role);
            item.RoleAssignments.Add(assignment);

            item.Update();

            
this.EnableEventFiring();
        }

 


//角色基类:实际上基类提供了查看的权限,因此在查看中不需要扩展
public abstract class BasePermissionRole
    {
        
private string roleName;
        
public virtual string RoleName
        {
            
get
            {
                
return roleName;
            }
            
set
            {
                roleName 
= value;
            }
        }

        
private string roleDescription;
        
public virtual string RoleDescription
        {
            
get
            {
                
return roleDescription;
            }
            
set
            {
                roleDescription 
= value;
            }
        }

        
public abstract SPBasePermissions ComposePermission();

        
protected virtual SPBasePermissions ComposeViewPermission()
        {
        
//对应Sharepoint下的34个基本权限
            return SPBasePermissions.ViewListItems | SPBasePermissions.ViewVersions |
                   SPBasePermissions.ViewFormPages 
| SPBasePermissions.ViewPages |
                   SPBasePermissions.OpenItems 
| SPBasePermissions.CreateAlerts |
                   SPBasePermissions.BrowseUserInfo 
| SPBasePermissions.UseRemoteAPIs |
                   SPBasePermissions.UseClientIntegration 
| SPBasePermissions.Open;
        }

        
public abstract BaseRoleRegister CreateRegister();//通过依赖倒置以及单件实现角色注册
    }
//新建角色,override基类的ComposePermission()方法,并在View的基础上扩展
public class AddPermissionRole : BasePermissionRole
    {
        
public AddPermissionRole()
        {
            
this.RoleName = "新建"
            
this.RoleDescription = "向列表中添加项目,向文档库中添加文档,以及添加 Web 讨论评论";
        }

        
public override string RoleName
        {
            
get
            {
                
return base.RoleName;
            }
            
set
            {
                
base.RoleName = value;
            }
        }

        
public override SPBasePermissions ComposePermission()
        {
            
return base.ComposeViewPermission() | SPBasePermissions.AddListItems;
        }

        
public override BaseRoleRegister CreateRegister()
        {
            
return new AddRoleRegister(this);
        }
    }

//注册基类:
public class BaseRoleRegister
    {
        
public BaseRoleRegister(BasePermissionRole role)
        {
            
this.Permission = role;
        }

        
protected BasePermissionRole Permission;

        
public virtual SPRoleDefinition ExecuteRegister(SPWeb web)
        {
            
foreach (SPRoleDefinition rd in web.RoleDefinitions)
            {
                
if (rd.Name == this.Permission.RoleName)
                    
return rd;
            }

            SPRoleDefinition definition 
= new SPRoleDefinition();
            definition.Name 
= this.Permission.RoleName;
            definition.BasePermissions 
= this.Permission.ComposePermission();
            definition.Description 
= this.Permission.RoleDescription;

            web.RoleDefinitions.BreakInheritance(
truetrue);
            web.RoleDefinitions.Add(definition);
            web.Update();

            
return web.RoleDefinitions[this.Permission.RoleName];
        }
    }

//新建角色的注册类:
public class ApproveRoleRegister : BaseRoleRegister
    {
        
public ApproveRoleRegister(BasePermissionRole role)
            : 
base(role)
        { }

    }
posted @ 2009-05-13 06:59 蜘蛛 阅读(1082) | 评论 (0)编辑 收藏

仅列出标题
共9页: 上一页 1 2 3 4 5 6 7 8 9 下一页