0%

最近做一個SharePoint的功能,需要將SiteCollection裡面所有子網站的清單全數撈出來,並判斷是否為Survey或Announcement

  • 判斷是否為Survey ```csharp
    List.BaseType.ToString() ==”Survey”
    1
    2
    3
    4

    * 判斷是否為Announcement ```csharp
    List.BaseTemplate.ToString() == "Announcements"

問卷 Survey
公告 Announcements
文件庫 DocumentLibrary

另外網路上查到各種清單的對照表,可以參考 : 清單對照表

[![](http://1.bp.blogspot.com/-BbJDYNJ9yJQ/UNu49lR8hFI/AAAAAAAAAeA/ETeG2o2Gs4M/s640/111.png)](http://1.bp.blogspot.com/-BbJDYNJ9yJQ/UNu49lR8hFI/AAAAAAAAAeA/ETeG2o2Gs4M/s1600/111.png)

建立VisualWebPart(後面簡稱vwp)後會產生以下檔案結構

[![](http://4.bp.blogspot.com/-sj79ZvE6lH4/UNu5jeqCYrI/AAAAAAAAAeI/stuhIeBL11k/s1600/111.png)](http://4.bp.blogspot.com/-sj79ZvE6lH4/UNu5jeqCYrI/AAAAAAAAAeI/stuhIeBL11k/s1600/111.png)
**.XML檔中可以設定vwp佈署後歸類在哪個群組裡面**
[![](http://4.bp.blogspot.com/-Vv3Q5WgnzGo/UNu68vKX92I/AAAAAAAAAeg/l0j6pcw1oLY/s640/111.png)](http://4.bp.blogspot.com/-Vv3Q5WgnzGo/UNu68vKX92I/AAAAAAAAAeg/l0j6pcw1oLY/s1600/111.png)
[![](http://4.bp.blogspot.com/-8K_6ifqFwTw/UNu7eFJb4gI/AAAAAAAAAeo/uMqpnmtiMNc/s320/111.png)](http://4.bp.blogspot.com/-8K_6ifqFwTw/UNu7eFJb4gI/AAAAAAAAAeo/uMqpnmtiMNc/s1600/111.png)
**VWP的CS檔中可以增加可設定的參數**
```csharp namespace ScinoPharm.EIP.vwpSurveys { [ToolboxItemAttribute(false)] public class vwpSurveys : WebPart { //增加可設定的參數 [Category("MySetting"), Personalizable(PersonalizationScope.Shared), //共用設定 WebBrowsable(true), //是否顯示在面板上 WebDisplayName("來源清單名稱"), WebDescription("請填寫Survey資料來源的清單名稱") //描述 ]
        public string ListName{get;set;}

        //當您變更視覺 Web 組件專案項目時,Visual Studio 可能會自動更新此路徑
        private const string _ascxPath = @"~/_CONTROLTEMPLATES/ScinoPharm.EIP/vwpSurveys/vwpSurveysUserControl.ascx";

        protected override void CreateChildControls()
        {
            Control control = Page.LoadControl(_ascxPath);
            ControlSkin.Add(control);
        }
    }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div class="separator" style="clear: both; text-align: left;">**
**</div><div class="separator" style="clear: both; text-align: center;">[![](http://4.bp.blogspot.com/-vNWquvR2rzs/UNu9Aq_nY_I/AAAAAAAAAe4/lNd-Ro9x2Z4/s1600/111.png)](http://4.bp.blogspot.com/-vNWquvR2rzs/UNu9Aq_nY_I/AAAAAAAAAe4/lNd-Ro9x2Z4/s1600/111.png)</div><div class="separator" style="clear: both; text-align: left;">
</div><div class="separator" style="clear: both; text-align: left;">
</div>**在UserControl中要抓到VWP的參數設定,需要透過以下的方法**
```csharp
public vwpSurveys SurveyParameter;

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
SurveyParameter = this.Parent as vwpSurveys;
}
}

**
**

ASP.NET中的TreeView有ontreenodecheckchanged的事件,但當你在TreeView上打勾時,卻不會觸發Post Back的效果

[![](http://2.bp.blogspot.com/-hIBTtd4zrrQ/UNu4XQV-SvI/AAAAAAAAAd4/wxCJqnyVB8Q/s1600/111.png)](http://2.bp.blogspot.com/-hIBTtd4zrrQ/UNu4XQV-SvI/AAAAAAAAAd4/wxCJqnyVB8Q/s1600/111.png)
查了一下,原來.Net會記住你目前TreeView的狀態,當有任何東西造成Post Back的時候(例如按按鈕),就會觸發ontreenodecheckchanged的事件

所以如果想要CheckBox點擊時能即時的Post Back就要做一些小加工

  1. 先加一個按鈕,並請隱藏起來

    這裡需要特別注意不能直接用Visible=”false“將按鈕隱藏,否則ASP不會將這個按鈕真的Render出來。所以請用CSS的方式隱藏吧!!
  2. 透過JavaScript的方式(這邊利用JQuery撰寫),偵測當CheckBox被點擊時去觸發我們隱藏起來的Button,透過這個Button達到Post Back的效果

這樣就會進到ontreenodecheckchanged的事件

[![](http://2.bp.blogspot.com/-qkdq-K0tGW0/UNu0IfXO4qI/AAAAAAAAAdk/Gt2D8z_Ijyw/s1600/111.png)](http://2.bp.blogspot.com/-qkdq-K0tGW0/UNu0IfXO4qI/AAAAAAAAAdk/Gt2D8z_Ijyw/s1600/111.png)

詳細可以參考這個網站

節錄摘要,

if (oWeb.DoesUserHavePermissions(SPBasePermissions.ViewPages))
{
      SPList oList = oWeb.Lists[ListName];
      if (oList.DoesUserHavePermissions(SPBasePermissions.ViewListItems))
      {
          // some smart code
      }
}

因為要先Get Web或是List的物件才能進行判斷,所以如果該使用者對該物件沒有權限,這樣寫可能會當掉,所以建議寫法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SPUser User = SPContext.Current.Web.CurrentUser; //先記錄目前使用者

SPSecurity.RunWithElevatedPrivileges(delegate { //進行升權的動作
using (SPSite Site = new SPSite(SPContext.Current.Site.ID))
{
using (SPWeb Web = Site.OpenWeb(WebName))
{
//在將剛剛紀錄的使用者丟到Function進行權限的判斷
if(Web.DoesUserHavePermissions(User.LoginName,SPBasePermissions.ViewPages))
{
SPList List = Web.GetList(URL);
if(List.DoesUserHavePermissions(User, SPBasePermissions.ViewPages))
{
HavePermission = true;
}
}
}
}
});


或是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//如果不把SPSecurity.CatchAccessDeniedException改回正常狀況,Sharepoint網站會直接返回無權限的頁面
//並停止執行接下來的程式
private bool CheckPermission(SPWeb _web)
{
Boolean catchException = SPSecurity.CatchAccessDeniedException;
SPSecurity.CatchAccessDeniedException = false;
try
{
if (_web.DoesUserHavePermissions(currentUser.LoginName, SPBasePermissions.ViewPages))
{
return true;
}
else
{
return false;
}
}
catch
{
return false;
}
finally
{
//reset the flag to original value
SPSecurity.CatchAccessDeniedException = catchException;
}
}

是DisplayName不是Account喔!!

[![](http://2.bp.blogspot.com/-NaAuRmyrQd0/UKG2nwaZzcI/AAAAAAAAAOM/dE6rh8dC8PI/s1600/1.png)](http://2.bp.blogspot.com/-NaAuRmyrQd0/UKG2nwaZzcI/AAAAAAAAAOM/dE6rh8dC8PI/s1600/1.png)

我在佈署SharePoint專案時在LayOut資料夾底下放了一個Log的資料夾,打算在該資料夾寫txt的Log檔用,結構如下圖

首先要在Log資料夾裡下先隨便放個檔案,否則VS在佈署時發現該資料夾沒檔案就不會真的建那個該資料夾出來。

以下程式是抓到佈署完之後該資料夾的實體位置,並以一天一檔案的方式寫Log檔

[![](http://3.bp.blogspot.com/-Gjb8chCZLdk/UKG1rVrrveI/AAAAAAAAAOE/5F6qYNcbPg4/s1600/1.png)](http://3.bp.blogspot.com/-Gjb8chCZLdk/UKG1rVrrveI/AAAAAAAAAOE/5F6qYNcbPg4/s1600/1.png)

當ListItem有附加檔案時,用以下方法來抓取該附檔的連結

[![](http://3.bp.blogspot.com/-4cMr5xgDNcY/UKGzLSCms9I/AAAAAAAAAN0/iUjTDRLCsTk/s1600/1.png)](http://3.bp.blogspot.com/-4cMr5xgDNcY/UKGzLSCms9I/AAAAAAAAAN0/iUjTDRLCsTk/s1600/1.png)

參考資料

透過命令提示字元佈署

  • stsadn 路徑 ```html
    C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN
1
2
3
4
5

* 部署
* 加入Solution ```html
stsadm -o addSolution –filename [xxxx.wsp]

*   部署Solution               ```html

stsadm -o deploysolution –name [xxxx.wsp] -immediate –url [SiteURL] -allowGacDeployment

1
2
3
4

* 移除
* 解除Solution```html
stsadm -o retractsolution –name [xxxx.wsp] -immediate -url [SiteURL]
*   移除Solution```html

stsadm -o deletesolution –name [xxxx.wsp]

1
2
3
4

* 更新
* 如果Solution已經在網站上使用,就可以使用下面一句命令就可以更新,不用先執行上面先解除再移除然後再重新部署 ```html
stsadm -o upgradesolution –name [xxxx.wsp] –filename [xxxx.wsp] -immediate -allowgacdeployment

透過SharePoint管理介面更新佈署

  • 部署

      *   加入Solution              ```html
    

    Add-SPSolution C:\xxx.wsp

    1
    2
    3

    * 安裝Solution ```html
    Install-SPSolution -Identity xxx.wsp -WebApplication http://xxxx.com.tw -GACDeployment
  • 更新 ```html
    Update-SPSolution -Identity xxx.wsp -LiteralPath C:\xxx.wsp -GACDeployment

    1
    2
    3

    * Restore ```html
    restore-spsite -identity http://xxx.com.tw -path d:\xxx.bak -force

1.先開啟sharepoint site
2.開啟web
3.選擇清單
4.清單裡面item要撈出哪幾個欄位

[![](http://4.bp.blogspot.com/-h3eeHiTjNpM/UI4oUiZsetI/AAAAAAAAANM/bOXEld8V_7E/s1600/1.png)](http://4.bp.blogspot.com/-h3eeHiTjNpM/UI4oUiZsetI/AAAAAAAAANM/bOXEld8V_7E/s1600/1.png)

=====================================================================

sharepoint在撈清單時,預設用使用者的權限去取得該清單的item

但有時候該清單需要更高的權限才能存取,這時候就要先做升權的動作,如紅框處

[![](http://3.bp.blogspot.com/-cZafIYUsPtU/UKGvm9LbLjI/AAAAAAAAANg/Mc0HN0vuuLc/s1600/1.png)](http://3.bp.blogspot.com/-cZafIYUsPtU/UKGvm9LbLjI/AAAAAAAAANg/Mc0HN0vuuLc/s1600/1.png)

紫色框框處為清單的搜尋語法,但還在摸索中,先做個簡單的紀錄!!

最近用IE判斷某檔案是否存在,路徑分別有以下兩種情況
相對路徑 : %appdata%\Microsoft\Windows\Start Menu\Programs\Accessories\Notepad.lnk
絕對路徑 : C:\xxx\xxxx\Microsoft\Windows\Start Menu\Programs\Accessories\Notepad.lnk

原本只是單純使用ActiveXObject(‘Scripting.FileSystemObject’)FileExists來判斷該檔案是否存在

在絕對路徑下都很OK,但這個function無法判斷相對路徑,所以必須先做一個轉換為絕對路徑的動作
var objShell = new ActiveXObject(“Wscript.Shell”); 

objShell.ExpandEnvironmentStrings(“%appdata%\Microsoft\Windows\StartMenu\Programs\Accessories\Notepad.lnk”);

再丟給FileExists來判斷檔案是否存在,即大功告成。

全部code

1
2
3
4
5
6
7
8
9
10
11
12
13
var objnav = navigator;
var OsVersion = objnav.appVersion;
var fso = new ActiveXObject('Scripting.FileSystemObject');
var objShell = new ActiveXObject("Wscript.Shell");

strfolderpath = objShell.ExpandEnvironmentStrings("%appdata%\\Microsoft\\Windows\\StartMenu\\Programs\\Accessories\\Notepad.lnk");
if (fso.FileExists(strfolderpath)){
alert('絕對路徑有');
}
else{
alert('絕對路徑沒有');
}