分類存檔: SharePoint 發展

簡單的解釋: “值並不屬於在預期的範圍。”

更新: 匿名的海報留下偉大的評論關於內部名稱. 一定要閱讀它.

使用事件接收器和其他代碼引用的物件模型通過 SharePoint 清單項時, 我常常犯錯誤,生成此執行階段錯誤:

載入時出錯,在 xyzzy 運行事件接收器 Conchango.xyzzyEventReceiver, 版本 = 1.0.0.0, 文化 = 中性, Publickeytoken) = 0dc50a750396c3ac. 附加資訊是下面. : 值不在預期的範圍內.

這是一個相當通用的錯誤,可能造成許多不同的方式. 不過, 一個簡單的解釋是,我錯誤地引用欄位. 如果欄位的名稱是"到期日", 我必須在事件接收器中引用它像這樣:

屬性。ListItem["截止日期"]

當我拼錯或引用該欄位時,使用錯誤的大小寫, SharePoint 生成上述提到的執行階段錯誤. 舉個例子, 這是不對的:

屬性。ListItem["截止日期"]

</結束>

訂閱我的博客.

Technorati 標籤:

快速 & 容易: 創建一個資料夾,並將分配的內容類型 (或, 有你的 Kpi 和吃它們太)

為了變通 KPI 問題 我寫了關於這裡, 我做了一些測試,發現該 KPI 工作對 meta 資料的資料夾相同的方式,他們工作對檔或清單專案. 我證明了通過創建新的內容類型基於資料夾內容類型,然後添加幾個欄位. 我創建了一些指標和證明自己 Kpi 按預期方式工作. 這是一個好消息. 它並不完美, 因為向下切入你從 KPI 對資料夾不是你想要什麼. 這不是在我的例子太多缺點因為 1) 最終使用者不知道任何更好和 2) 向下切入轉到資料夾. 他們按一下資料夾名稱和他們處於專案. 它是一個兩次點擊, 這不是世界末日.

這很好地流的是我正在做的工作. 我創建了一個資料夾獲取上傳的每個文檔. 這是通過事件接收器. 作為一個結果, 它是一塊蛋糕要保持 父資料夾 元資料同步與 KPI 驅動中繼資料從檔本身因為水管已到位. 這讓我可以擁有我的 KPI,也可以吃它們 🙂

我修改事件接收器添加該資料夾,然後將這個新資料夾中的內容類型設置為我自訂 KPI 友好內容類型. 這段代碼是成功的關鍵:

 SPFolderCollection srcFolders = targetWeb.GetFolder("檔").子資料夾;
  SPFolder addedFolder = srcFolders.Add(屬性。ListItem.ID.ToString());
  SPContentTypeId kpiCT = 新增功能 SPContentTypeId("0x0120002A666CAA9176DC4AA8CBAA9DC6B4039F");
  addedFolder.Item["內容類型 ID"] kpiCT =;
  addedFolder.Item.Update();

若要查找實際的內容類型 ID, 我訪問通過網站設置該內容類型和複製/粘貼它從如圖所示的 URL:

圖像

</結束>

訂閱我的博客!

Technorati 標籤: ,

快速而方便地: 事件接收器中獲取 SPListItem 的 SPFolder

我不願承認這一點, 但這一所有困擾了我一天. 我的事件接收器需要更新其父資料夾的欄位. 這一點點演示如何做它:

私人 無效 UpdateParentFolder(SPItemEventProperties 屬性)
{

SPFolder thisItemFolder = 屬性。ListItem.File.ParentFolder;
thisItemFolder.Item["ZZ 審批狀態"] = "好消息, 每個人都!";
thisItemFolder.Item.Update();


} // UpdateParentFolder

在此情況下, 我正在與文件庫和屬性都來自 ItemAdded 事件.

訣竅是你不能直接從專案本身得到的該專案的 SPFolder (e 小節. 屬性。ListItem.Folder 為空). 相反, 轉到清單項關聯的檔,並獲取該檔的資料夾.

</結束>

訂閱我的博客!

Technorati 標籤:

然而另一個事件接收器調試技巧

我確信我不是第一次的人來了. 不過, 我沒注意到有人開始密切關注社區去年 7 月發佈這樣的小把戲. 所以, 我還以為會張貼本快速、 方便的調試技巧.

我正在開始產生此錯誤的事件接收器 12 配置單元:

載入時出錯,在 xyzzy 運行事件接收器 Conchango.xyzzyEventReceiver, 版本 = 1.0.0.0, 文化 = 中性, Publickeytoken) = blahbalhbalh. 附加資訊是下面. : 未設置到物件的實例的物件引用.

我不知道在哪裡我曾經引進了這個 bug,因為我做了太多的事情,在我的代碼,部署,測試週期之一.

我試過 此解決方案 進去我 pdb 的希望那 SharePoint 12 蜂巢將會顯示堆疊追蹤, 但沒有運氣. 我不知道如果有可能,如果有人做了, 請讓我知道 🙂

這是可能的 寫給自己的日誌消息 12 配置單元. 坦白地說, 我想要的東西有點不那麼可怕和更快地執行.

我突然想到我至少能一些基本的跟蹤資訊的捕捉並再次引發這樣的泛型異常:

  請嘗試 {
    UpdateEditionDate(屬性);
  }
  捕獲 (異常 e)
  {
    拋出 新增功能 異常("調度員, UpdateEditionDate(): 異常: [" + e.ToString() + "].");
  }

這在出現了 12 蜂巢難耐:

載入時出錯,在 xyzzy 運行事件接收器 Conchango.xyzzyEventReceiver, 版本 = 1.0.0.0, 文化 = 中性, Publickeytoken) = 哈裡斯. 附加資訊是下面. : 調度程式, UpdateEditionDate(): 異常: [NullReferenceException 系統。: 未設置到物件的實例的物件引用. 在 Conchango.xyzzyManagementEventReceiver.UpdateEditionDate(SPItemEventProperties 屬性) 在 Conchango.xyzzyManagementEventReceiver.Dispatcher(SPItemEventProperties 屬性, 字串 eventDescription)].

這給了我所有的細節,我需要追蹤那個特定的問題,我希望使用它很多事要向前.

</結束>

訂閱我的博客!

解決方案: SPQuery 不能搜尋資料夾

過去這周我正在實施"演變" 使用 BDC 和 SPQuery 並遇到一些困難,使用 SPQuery 針對包含資料夾的文件庫的用戶端解決方案. 底線: 分配"遞迴" 在視圖屬性中的查詢.

我的方案:

  • 週一, 上傳文檔,並提供一些中繼資料.
  • 下一周, 我上傳一個新的文檔. 很多此新文檔的中繼資料基於我週一傳的文檔 (我們稱之為"主控文件").
  • 我們已經創建了 web 服務的屏風,這提供一個 BDC 友好介面到清單中,以便使用者可以方便地找到那個星期一文檔通過標題搜索.
  • BDC 資料列提供了一個友好的使用者介面. (這是嘗試的我在為一個更友好的查閱列使用 BDC 的一部分).

最後的 BDC 外立面服務使用像這樣的查詢進行查找:

 // U2U 工具用於説明生成此 CAML 查詢.
      oQuery.Query =
        "<在哪裡>";

      如果 (titleFilter.Length > 0)
        oQuery.Query   =
          "  <和>";

      oQuery.Query   =
        "    <和>" +
        "      <Geq>" +
        "        <FieldRef 名稱 = "DocumentId" />" +
        "        <數值型別 = "Text">" + minId + "</價值>" +
        "      </Geq>" +
        "      <Leq>" +
        "        <FieldRef 名稱 = "DocumentId" />" +
        "        <數值型別 = "Text">" + maxId + "</價值>" +
        "      </Leq>" +
        "    </和>";

      如果 (titleFilter.Length > 0)
        oQuery.Query   =
          "    <包含>" +
          "      <FieldRef 名稱 = "Title" />" +
          "      <數值型別 = "Text">" + titleFilter + "</價值>" +
          "    </包含>" +
          "  </和>";
      oQuery.Query   =
        "</在哪裡>";

在發展的初始階段, 這工作得非常棒. 不過, 我們引入的目錄來解決一些問題的資料夾和突然, 我 BDC 選取器不會返回任何結果. 我跟蹤這 SPQuery 將永遠不會返回任何結果的事實. 我們資料夾主要用於允許多個檔具有相同的名稱,要上載,但使用不同的中繼資料. 當上載檔, 我們創建一個基於 ID 的清單項的資料夾,然後將該檔移那裡 (我曾寫過, 在這裡; 我們已經 好壞參半的結果 這種方法,但總體上, 它工作好). 使用者不關心資料夾,事實上, 真不明白有任何資料夾. 我們已經配置上要顯示的專案而不考慮資料夾的庫的所有視圖.

我打了兩倍的技術實施發展和解決它以不同的方式每次這個問題. 第一次, 我不在查詢中使用包含運算子. 沒有包含運算子, 我是能夠解決的問題通過指定視圖上 SPQuery 的建構函式. 而不是使用預設的建構函式:

SPList oList = web。清單["檔"];

SPQuery oQuery = 新增功能 SPQuery();

我轉而用於指定視圖的建構函式:

SPList oList = web。清單["檔"];

SPQuery oQuery = 新增功能 SPQuery(oList.Views["所有文檔"]);

這解決了這個問題,我開始變得我的結果.

然後加入混合的 CONTAINS 操作符,它再一次打破了. 原來,包含運算子, 到目前為止,我可以告訴, 不能與視圖相同的方式更簡單的 GEQ / LEQ 運算子. 我做了一些搜索,學到了,該查詢 ViewAttributes 應該設置為"遞迴", 如在:

oQuery.ViewAttributes = "範圍 = "Recursive"";

包含用於解決了這個問題. 事實上, 這也解決了我原來的搜索問題,如果我有指定遞迴屬性第一次, 我將不會遇到這一問題再一次.

基於視圖的 SPQuery 工程部分經營者這一事實 (GEQ/LEQ) 而不是別人 (包含), 加上這一事實似乎 Kpi 不能工作在所有與此資料夾包含的文件庫主角我相信 SPQuery 具有正交性的幾個問題.

特別感謝:

  • 在的好人們 U2U 和他們的查詢工具.
  • 邁克爾 · 哈弗的偉大 "邊學邊做" 博客張貼內容, 意見及回應.

</結束>

訂閱我的博客!

MOSS KPI 的 bug? 綁定到文件庫的資料夾的清單指示器

更新 02/29/08: 這解決了創建一個資料夾,然後將內容類型分配給有需要用於 Kpi 的 meta 資料的資料夾. 中一些更多的細節所述,.

我們已實施技術解決方案,使用者將文檔上載到文件庫. 事件接收器創建目錄,並將檔移到該目錄 (使用與我曾寫過類似的技術 在這裡). 我們已經成功地駛過致重命名上傳的檔的事件接收器的潛在問題 (主要是因為使用者永遠不會通過點擊"新建開始他們的文檔" 但相反創建本地的文檔,然後將它們上載).

這些檔的中繼資料包括 Yes/沒有網站列稱為"緊急" 和另一個網站欄名為"狀態". 我們需要顯示的百分比"緊急的業務要求" 其狀態為"掛起"的文檔.

這是通常簡單做 和我描述很多這樣的事在 SharePoint 獵兔犬 有很多的螢幕截圖,如果你有興趣.

總括, 我做了以下:

  • 創建一個稱為"掛起"的文件庫的視圖.
  • 配置要忽略的資料夾結構的視圖.
  • 創建 KPI 清單.
  • 創建指向文件庫和清單中的一項指標"掛起" 視圖.

這是完全行不通. KPI 顯示我的目標 (例如:. 五個緊急檔) 但總是顯示緊急檔為零的實際數. 矛盾的是, 如果您深入查看詳細資訊, 它顯示清單中的五個緊急檔. 我與兩個文檔創建一個非常簡單的場景, 一個在一個資料夾和一個不. 這裡是螢幕截圖:

圖像

上面的螢幕擷取畫面清楚顯示有兩個文檔中的視圖,但"價值" 是一種. "CamlSchema" 空白文檔 Id 是根資料夾中,另一個是在一個名為"84"資料夾中.

在我看來,即使您指定的視圖, KPI 不會榮譽"顯示所有專案沒有資料夾" 設置,而, 限定自己到根資料夾.

如果我錯了, 請放我一條線或留下評論.

</結束>

訂閱我的博客!

Technorati 標籤:

解決問題的辦法: “FileNotFoundException” 與我功能接收器.

我正在研究一種功能上個星期,會將一些事件接收器添加到特定清單實例. (我在博客上有點寫在這裡那清單接收器).

使用命令列, 我無法安裝該功能,沒有錯誤 (但請參閱下面的隱藏錯誤). 當我試圖部署上該網站的功能, MOSS 抱怨的"FileNotFoundException" 錯誤. 此博客條目描述怎麼解決的.

這是 MOSS 給我看了在 web 瀏覽器中的錯誤:

功能 ' b2cb42e3-4f0a-4380-aaba-1ef9cd526f20’ 不安裝,因為載入的事件接收器程式集"xyzzyFeatureReceiver_0" 失敗: System.IO.FileNotFoundException: 未能載入檔或程式集 xyzzyFeatureReceiver_0’ 或它的一個依賴項. 系統無法找到指定的檔.
檔案名稱: ' xyzzyFeatureReceiver_0’
在 System.Reflection.Assembly.nLoad(程式集名稱的檔案名, 字串的代碼庫, 證據 assemblySecurity, 大會 locationHint, StackCrawlMark& stackMark, 布林 throwOnFileNotFound, 布林 forIntrospection)
在 System.Reflection.Assembly.InternalLoad(程式集名稱 assemblyRef, 證據 assemblySecurity, StackCrawlMark& stackMark, 布林 forIntrospection)
在 System.Reflection.Assembly.InternalLoad(字串 assemblyString, 證據 assemblySecurity, StackCrawlMark& stackMark, 布林 forIntrospection)
在 System.Reflection.Assembly.Load(字串 assemblyString)
在 Microsoft.SharePoint.Administration.SPFeatureDefinition.get_ReceiverObject()
警告: 程式集綁定日誌記錄被關閉.
要啟用程式集綁定失敗日誌記錄, 設置註冊表值 [HKLMSoftwareMicrosoftFusion!EnableLog] (DWORD 值) 自 1.
請注意: 有一些與程式集綁定失敗日誌記錄關聯的性能損失.
若要關閉此功能, 刪除註冊表值, [HKLMSoftwareMicrosoftFusion!EnableLog].

解決 Windows SharePoint 服務的問題.

我知道如何故意導致該錯誤: 不在 gac 中安裝程式集. 但, 它是在 gac 中. 我通常將程式集安裝到 gac 中通過將它們拖入 c:\使用 windows 資源管理器的 windowsassembly 資料夾. 我從來 100% 舒適這樣做,因為我一直以為那 gacutil 存在的理由 … 所以我試過了. 它沒有區別.

互聯網中搜索的結果,我發現這篇文章: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2243677&SiteID=1

海報發生了將使用的相同的根位的代碼 (從這裡面 WSS 本書從該清單中) 所以這是一個充滿希望的跡象. 不過, 裝飾與大會的建議 [大會: ] 指令對我沒有意義. 不管怎樣,我還是把它嘗試,右. 它沒有區別.

然後我注意到我的類定義是不公開. 我將它公開並無差異.

下一次, 去了啟用"程式集綁定失敗日誌的麻煩" (之後的有益的和準確的說明提供) 這是在哪裡,事情開始變得有趣. 該日誌顯示我運行時到處搜索,該伺服器上為我的程式集. 它甚至似乎在尋找它在我的藥櫃. 但 … 它不會為它在 gac 中搜索.

我穿上我冬季夾克和去再次搜索互聯網,發現有人也有這問題. 在這個帖子中的冗長討論彼得斯掉到什麼和我找不到解決方案.

我將我的程式集移動到日誌聲稱它搜索並多一點進步的地方之一. 一個新的錯誤,在瀏覽器中嘗試啟動該功能時我得到現在工作:

未能從程式集"xyzzyFeatureReceiver_0"創建功能接收器物件, 鍵入"Conchango.xyzzyFeatureReceiver" 為功能 b2cb42e3-4f0a-4380-aaba-1ef9cd526f20: System.ArgumentNullException: 值不能為空.
參數名稱: 類型
在 System.Activator.CreateInstance(類型類型, 布林非公開)
在 System.Activator.CreateInstance(類型類型)
在 Microsoft.SharePoint.Administration.SPFeatureDefinition.get_ReceiverObject()

解決 Windows SharePoint 服務的問題.

互聯網的一個上次去的時候!

這次我發現, 不出所料, 苔蘚發出此錯誤,因為程式集不是 GAC 中.

我想要得到的東西這積極並嘗試覺得很驕傲我創建了 MSIL 程式集的逃犯, 但它不工作. 我只是平原惱火. 我發現自己喃喃自語"雞還是先有蛋" 根據我的呼吸.

我最後決定平底船. 我創建一個完全新的專案和複製/粘貼到這個新專案從 incredible-cloaked-from-the-GAC-assembly 非工作專案在代碼. (我去找叫什麼像"從程式集綁定如果安裝到 GAC 中隱藏一個生成標誌" 但找不到一個).

我安裝功能,並將其啟動和 … 它的工作! 所以, 這一切之後, 我基本上已經到 ' 重新開機’ 我的專案. 這就是我為什麼討厭的電腦的另一個原因.

我確實學到一些有用的這. 以前安裝過整天都使用 stsadm 命令列功能和已使用"-力" 出於習慣選項. 因為某些原因, 我沒有使用-force 選項,當你安裝了新的專案. 這一次, 我實際上做了, 真正忘了將這個新專案的程式集複製到 gac 中. 作為一個結果, 收到了"FielNotFoundException" 錯誤. 這一次, 我從 stsadm 弄, 沒有,當我試著啟動通過 web 瀏覽器功能. 所以, -力事實上是扮演兩個角色. 它允許您重新安裝現有的功能. 它還允許您將不能工作在運行時通過抑制錯誤越野功能安裝. 它可能表示盡可能説明地方但永遠不會注意到了它.

</結束>

Technorati 標籤: ,

快速 & 容易: 重命名已上載的檔,使用事件接收器通過 SharePoint 物件模型

更新: 這工作,但有很大的局限性,介紹了在評論中. 這可能仍然是有用的一些基本狀況.

更新 2: 我當前的專案中, 使用者始終上載檔. 作為一個結果, 不會遇到一個問題 MS Word 正在運行,並且認為它重命名該檔. 我也遇到一個問題, "修改該檔的其他人" 並解決了這個問題通過一個簡單的信號類型標誌. 使用者需要從其預設值的元資料欄位更改為別的東西. Itemupdated() 在實際執行重命名之前,自那時以來,接收器看上去為一個有效的值, 我沒有任何問題. 您的里程可能會發生變化.

我有一個用戶端要求更改上載到以符合特定的命名約定的特定文件庫的檔案名稱. 該 API 並不提供"重命名()" 方法. 相反, 我們使用 "MoveTo(…)". 這裡是代碼的最少來完成這位:

 公眾 重寫 無效 ItemAdded(SPItemEventProperties 屬性)
        {
            SPFile f = 屬性。ListItem.File;

            f.MoveTo(屬性。ListItem.ParentList.RootFolder.Url + "/xyzzy.doc");
            f.Update();

        }

唯一麻煩的地方是"屬性。"ListItem.ParentList.RootFolder.Url. MoveTo() 方法需要一個 URL. 那搗碎的字串點我到我當前的文件庫的根資料夾中. 這讓我們避免任何硬編碼在我事件接收器.

這是一個更有用的版本,做同樣的事, 但將該檔的名稱分配給"標題":

 公眾 重寫 無效 ItemAdded(SPItemEventProperties 屬性)
        {
            DisableEventFiring();

            // 將此專案的標題分配給檔本身的名稱.
 // 請注意: 此項工作分配必須發生之前我們修改檔本身.
 // 調用 update() SPFile 似乎無效中的屬性
 // 某種意義上.  "標題的更新" 失敗之前,更改 (和更新() 調用)
 // 在更改前遷往該檔案名稱.
            屬性。ListItem["標題"] = 屬性。ListItem.File.Name;

            屬性。ListItem.Update();

            SPFile f = 屬性。ListItem.File;

            // 獲取檔的副檔名.  我們稍後需要,.
 字串 spfileExt = 新增功能 FileInfo(f.Name).擴展;

            // 重命名的檔的清單項的 id,並使用檔副檔名來保持
 // 它不變的部分.
            f.MoveTo(屬性。ListItem.ParentList.RootFolder.Url +
                "/" + 屬性。ListItem["ID"] + spfileExt);

            // 犯下移動.
            f.Update();

            EnableEventFiring();
        }

快速提示: 內容查詢 Web 組件, 查閱列的值和 XSL

我有一個列名在名為"房地產所在地"內容類型.

那列是"查找"類型的.

我已經修改 <CommonViewFields> 和 ItemStyle.xsl,若要顯示的列.

一個簡單的 <xsl:值的選擇 =…> 回返回包含序號位置資料的內部值, 如:

1;#邁阿密

若要獲取人類友好的價值, 使用 xsl 之後的字串, 如圖所示:

<xsl:valuexsl 選擇"子字串後 =(@Real_x005F_x0020_Estate_x005F_x0020_Location,’#’)"></xsl:值的>

使用此技術,每當您正在使用的 XSL 轉換中查找值,並需要獲得人類友好的價值.

<結束 />

Technorati 標籤: , ,

快速而方便地: 確定內部列列名稱的網站

更新: 傑瑞米 · 薩 對此話題的博客和貼一些 一個主控台應用程式的代碼 這表明內部名稱.

我想把內容查詢 web 部件以顯示從任務的截止日期,因為螢幕的標籤是"截止日期", 我以為,要在中使用的列名稱 <CommonViewFields> 是"Due_x0020_Date".

錯了!

"調度"是在這種情況下的實際列名稱.

我怎樣找到它? 我重新讀希瑟 所羅門的博客條目上修改 CQWP 要顯示的資料的附加列. 她描述了這一步的過程 #13. 相信它. 它是正確. 至少, 它是正確的對我來說. 我不相信它在第一次多長的名稱與另一列.

我說"信任它" 因為我不相信它,可能浪費了附近撞我的頭靠牆的兩個小時. 我解決"調度後" 名稱, 我想要添加到另一個欄位 <CommonViewFields>. 使用所羅門技術, 我得到了像"XYZ_x0020_Project_x0020_Due_x00"的列名稱.

我對自己說, 這顯然是截斷的名稱. 我去前方,未截斷它,但沒有成功. 我最後用看似截斷的名稱和它的工作.

特別提示: 當正在與 CQWP, 如果添加了一個壞的內部名稱與 <CommonViewFields>, CQWP 會告訴我,該查詢返回沒有結果. 但, 如果資料類型中添加欄位名稱, 它將返回一個結果. 添加資料類型實際上掩蓋的問題因為我引用一個不存在的欄位. 我可以把它, 但當我想要顯示它的值, 我總是會一片空白.

這不掩蓋錯誤:

<CommonViewFields>Due_x0020_Date;</CommonViewfields>

這是掩蓋錯誤:

<CommonViewFields>Due_x0020_Date,日期時間;</CommonViewfields>

</結束>