探索與發現

          研究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 蜘蛛 閱讀(318) | 評論 (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 蜘蛛 閱讀(231) | 評論 (1)編輯 收藏

          http://www.likespc.cn/Article/654.html
          posted @ 2009-05-15 08:15 蜘蛛 閱讀(187) | 評論 (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 蜘蛛 閱讀(214) | 評論 (2)編輯 收藏

          http://jlbc.skycn.com/down/HA-daemon4303.zip
          posted @ 2009-05-13 21:32 蜘蛛 閱讀(171) | 評論 (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 蜘蛛 閱讀(3625) | 評論 (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 蜘蛛 閱讀(874) | 評論 (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 蜘蛛 閱讀(571) | 評論 (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 蜘蛛 閱讀(470) | 評論 (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 蜘蛛 閱讀(1097) | 評論 (0)編輯 收藏

          僅列出標題
          共9頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 
          主站蜘蛛池模板: 伊宁县| 教育| 垣曲县| 南阳市| 壤塘县| 张家界市| 宁都县| 个旧市| 鹤岗市| 余干县| 石狮市| 灵山县| 鹤山市| 都匀市| 望城县| 新丰县| 高青县| 杭锦后旗| 台北市| 扶风县| 阜南县| 体育| 建始县| 依安县| 宣汉县| 庆元县| 板桥市| 邓州市| 福海县| 如皋市| 罗甸县| 新和县| 武义县| 泸州市| 台中县| 融水| 延长县| 买车| 南皮县| 萝北县| 赤峰市|