日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SharePoint2010内容类型剖析(四)

發(fā)布時間:2023/12/18 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SharePoint2010内容类型剖析(四) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

更新內(nèi)容類型

SharePoint允許對內(nèi)容類型進(jìn)行修改,即使已經(jīng)將內(nèi)容類型部署到網(wǎng)站、列表或已經(jīng)創(chuàng)建了相應(yīng)的列表項(xiàng)。


更新內(nèi)容類型的2條標(biāo)準(zhǔn)途徑


途徑1:對內(nèi)容類型進(jìn)行修改,并推送更新。這條途徑主要用在對使用中的內(nèi)容類型進(jìn)行有針對性的,離散的變更。比如,需要在網(wǎng)站內(nèi)容類型上添加一列。
途徑2:新建一個內(nèi)容類型,以滿足變更的需求。然后把原來的內(nèi)容類型加到_Hidden組。這條途徑主要用在需要徹底替換原有內(nèi)容類型,但是還需要保留已有的列表數(shù)據(jù)的情況下。比如,我們有一個已經(jīng)用了數(shù)年的產(chǎn)品規(guī)格內(nèi)容類型。現(xiàn)在,不得不變更產(chǎn)品的規(guī)格,以便體現(xiàn)新的要求。但由于歷史的原因,我們?nèi)匀灰A粼械漠a(chǎn)品規(guī)格內(nèi)容類型,因?yàn)橹耙呀?jīng)有無數(shù)的列表項(xiàng)是基于它來創(chuàng)建的。這時,我們可以新建一個內(nèi)容類型叫產(chǎn)品規(guī)格2010。然后通過Feature打包分發(fā),并在激活的代碼中通過程序?qū)⑿碌膬?nèi)容類型添加到所有舊內(nèi)容類型存在的列表中。然后將原來的產(chǎn)品規(guī)格內(nèi)容類型的Hidden屬性設(shè)為true。這樣,當(dāng)用戶創(chuàng)建產(chǎn)品規(guī)格時,他們只能選擇產(chǎn)品規(guī)格2010,原先的產(chǎn)品規(guī)格不在列出。但是,原先的列表項(xiàng)卻保持不變。


SharePoint提供了一種機(jī)制,允許通過改變SPContentType或ContentType對象的ReadOnlySealed屬性來控制變更。因此,在修改內(nèi)容類型前,應(yīng)該首先檢查這些屬性設(shè)置。

將更新內(nèi)容類型的代碼放在SPFeatureReceiver對象的FeatureActivated(SPFeatureReceiverProperties)方法內(nèi)。在完成對相應(yīng)對象中內(nèi)容類型的修改后,要記得調(diào)用該對象的Update方法將變更提交到數(shù)據(jù)庫中。我們可以在Update方法中指定是否要更新子內(nèi)容類型。


SharePoint并不會將內(nèi)容類型的更新寫回到內(nèi)容類型定義文件,而是存在SharePoint數(shù)據(jù)庫中。所有的列表內(nèi)容類型也都是存放在SharePoint數(shù)據(jù)庫中的。因此,任何時候都不要更改已經(jīng)安裝并激活使用的內(nèi)容類型的定義文件。SharePoint不會跟蹤這種變化。

使用對象模型更新內(nèi)容類型

  • 使用對象模型可以提供更細(xì)的推送粒度。
  • 記得調(diào)用Update方法將變更寫回數(shù)據(jù)庫。
  • 無法通過修改Feature XML文件中的網(wǎng)站內(nèi)容類型定義來添加欄
代碼 using?(SPWeb?oWebsite?=?new?SPSite("http://MyServer/sites/MySiteCollection/MyWebSite").OpenWeb())
{
????SPList?oList?
=?oWebsite.GetList("MyWebSite/Lists/MyList");
????SPFieldCollection?collFields?
=?oWebsite.Fields;
????
//新建一個網(wǎng)站欄
????string?strNewColumn?=?collFields.Add("出處",?SPFieldType.Text,?false);
????
//添加到網(wǎng)站內(nèi)容類型“消息”中
????SPFieldLink?oFieldLink?=?new?SPFieldLink(fields[strNewColumn]);
????SPContentType?oContentType?
=?oList.ContentTypes["消息"];
????oContentType.FieldLinks.Add(oFieldLink);

????oContentType.Update(
true);
}

內(nèi)容類型中的自定義信息

  • 按照設(shè)計初衷,內(nèi)容類型是可擴(kuò)展的。
  • 每個內(nèi)容類型都有一個XML集,用于存儲第三方解決方案中用到的一些信息(XML節(jié)點(diǎn)所代表的XmlDocument元素)。通過添加XML節(jié)點(diǎn),可以為內(nèi)容類型加入自定義信息。通過在內(nèi)容類型中包含自定義的XmlDocument元素,可以將我們解決方案中所需的自定義信息進(jìn)行一個封裝,使其成為內(nèi)容類型的一部分。

    可以通過兩種方式為內(nèi)容類型添加自定義信息:
    • 對于已經(jīng)部署好的內(nèi)容類型,我們可以通過OM以編程的方式訪問該集合中的Xml。只需要調(diào)用SPXmlDocumentCollectionAdd方法即可。
    • 對于未進(jìn)行部署的內(nèi)容類型,我們可以在內(nèi)容類型架構(gòu)定義XML中添加一個XmlDocument元素。

  • 內(nèi)容類型可以包含任何數(shù)目的XmlDocument元素。每個XmlDocument可以有自己的架構(gòu),只要是有效的XML即可。
  • 網(wǎng)站內(nèi)容類型中包含的XmlDocument內(nèi)容會自動復(fù)制到任何子代。推送的粒度也可以基于Xml節(jié)點(diǎn)。但是,SharePoint在覆蓋該xml節(jié)點(diǎn)前不會去判斷該節(jié)點(diǎn)是否正在被使用或是否為某個處理過程所必需。我們也可以刪除某個xml,并作為變更推送下去。

關(guān)聯(lián)工作流

SPContentType.WorkflowAssociations 屬性返回一個SPWorkflowAssociationCollection對象代表了內(nèi)容類型所關(guān)聯(lián)的所有工作流。我們可以通過Id屬性或GetAssociationByName方法取到其中某個工作流。每個集合內(nèi)的工作流的Name是唯一的。通過GetAssociationByName的返回值判斷是否重名。
代碼

if?(contentType.WorkflowAssociations.GetAssociationByName(workflowAssociation.Name,?site.Locale)?==?null)
{
????contentType.WorkflowAssociations.Add(workflowAssociation);
}
else
{
????contentType.WorkflowAssociations.Update(workflowAssociation);
}

?

實(shí)例:創(chuàng)建一個工作流關(guān)聯(lián),將其添加到某個網(wǎng)站內(nèi)容類型的工作流集合,然后推送到子代內(nèi)容類型
(注意:在新建項(xiàng)目的框架版本選擇時要選擇.Net Framework 3.5,還需要添加Microsoft.SharePoint.dll的引用)。下圖是實(shí)例中要用到的工作流模板,首先要確保其已激活。


點(diǎn)擊查看大圖

?

完成后查看工作流關(guān)聯(lián),可以看到下圖:


點(diǎn)擊查看大圖

?

以下是添加關(guān)聯(lián)的代碼:

代碼 using?System;
using?Microsoft.SharePoint;
using?Microsoft.SharePoint.Workflow;

namespace?TestWorkflowAssociation
{
????
class?ConsoleAdd
????{
????????
static?void?Main(string[]?args)
????????{
????????????Console.WriteLine();
????????????SPSite?siteCollection?
=?new?SPSite("http://sp2010u/sites/contoso/Docs");
????????????SPWeb?site?
=?siteCollection.OpenWeb();

????????????SPContentType?siteContentType?
=?site.ContentTypes["費(fèi)用報告"];
????????????
string?taskListTitle?=?"任務(wù)";
????????????
string?historyListTitle?=?"工作流歷史記錄";
????????????
string?workflowName?=?"紅-黃-綠";

????????????
//?獲取一個模板.
????????????SPWorkflowTemplate?workflowTemplate?=?null;
????????????
foreach?(SPWorkflowTemplate?template?in?site.WorkflowTemplates)
????????????{
????????????????workflowTemplate?
=?template;

????????????????
//?這里找一個自帶的模板.
????????????????if?(workflowTemplate.Name?==?"三態(tài)")?break;
????????????}
????????????
if?(workflowTemplate?!=?null)
????????????{
????????????????
//?創(chuàng)建一個關(guān)聯(lián).
????????????????SPWorkflowAssociation?workflowAssociation?=?SPWorkflowAssociation.CreateWebContentTypeAssociation(workflowTemplate,?workflowName,?taskListTitle,?historyListTitle);


????????????????
//?添加一個關(guān)聯(lián)到該內(nèi)容類型,如果關(guān)聯(lián)已存在則更新它.
????????????????Console.Write("工作流?{0}?已關(guān)聯(lián)?",?workflowAssociation.Name);
????????????????
if?(siteContentType.WorkflowAssociations.GetAssociationByName(workflowAssociation.Name,?site.Locale)?==?null)
????????????????{
????????????????????siteContentType.WorkflowAssociations.Add(workflowAssociation);
????????????????????Console.WriteLine(
"添加.");
????????????????}
????????????????
else
????????????????{
????????????????????siteContentType.WorkflowAssociations.Update(workflowAssociation);
????????????????????Console.WriteLine(
"更新.");
????????????????}

????????????????
//?將工作流關(guān)聯(lián)更新推送到子代內(nèi)容類型.
????????????????siteContentType.UpdateWorkflowAssociationsOnChildren(false,??//?不需要生成完整變更清單
?????????????????????????????????????????????????????????????????????true,???//?推送到繼承的子代網(wǎng)站內(nèi)容類型
?????????????????????????????????????????????????????????????????????true,???//?推送到列表內(nèi)容類型
?????????????????????????????????????????????????????????????????????false);?//?如果遇到密封或只讀內(nèi)容類型不拋異常??
????????????}
????????????site.Dispose();
????????????siteCollection.Dispose();

????????????Console.WriteLine();
????????????Console.Write(
"任意鍵繼續(xù)...");
????????????Console.ReadLine();
????????}
????}
}

以下代碼刪除剛才關(guān)聯(lián)的工作流:

代碼 using?System;
using?Microsoft.SharePoint;
using?Microsoft.SharePoint.Workflow;

namespace?TestWorkflowAssociation
{
????
class?ConsoleDel
????{
????????
static?void?Main(string[]?args)
????????{
????????????
using?(SPSite?site?=?new?SPSite("http://sp2010u/sites/contoso/Docs"))
????????????{
????????????????
using?(SPWeb?web?=?site.OpenWeb())
????????????????{
????????????????????
string?ctName?=?"費(fèi)用報告";
????????????????????
string?wfName?=?"紅-黃-綠";

????????????????????SPContentType?contentType?
=?web.ContentTypes[ctName];
????????????????????
if?(null?!=?contentType)
????????????????????{
????????????????????????SPWorkflowAssociation?wfAssociation?
=
????????????????????????????contentType.WorkflowAssociations.GetAssociationByName(wfName,?web.Locale);

????????????????????????
if?(null?!=?wfAssociation)
????????????????????????{
????????????????????????????
//?移除該工作流關(guān)聯(lián).
????????????????????????????contentType.WorkflowAssociations.Remove(wfAssociation);
????????????????????????????Console.WriteLine(
"與工作流?{0}?的關(guān)聯(lián)已移除.",?wfAssociation.Name);
????????????????????????}
????????????????????????
else
????????????????????????{
????????????????????????????Console.WriteLine(
"名為?{0}?的工作流關(guān)聯(lián)未找到.",?wfName);
????????????????????????}
????????????????????}
????????????????????
else
????????????????????{
????????????????????????Console.WriteLine(
"內(nèi)容類型?{0}?不存在.",?ctName);
????????????????????}
????????????????????
//?將工作流關(guān)聯(lián)更新推送到子代內(nèi)容類型.
????????????????????contentType.UpdateWorkflowAssociationsOnChildren(false,?true,?true,?false);?
????????????????}
????????????}
????????????Console.Write(
"\n任意鍵繼續(xù)...");
????????????Console.ReadLine();
????????}
????}
}

內(nèi)容類型XML架構(gòu)定義

  • 應(yīng)用一:可以在Feature中通過內(nèi)容類型的SchemaXml 新建一個內(nèi)容類型定義。
  • 應(yīng)用二:可以通過List定義中的ContentTypes元素在創(chuàng)建列表時自動附加一個已有的內(nèi)容類型

網(wǎng)站內(nèi)容類型定義中引用的欄或內(nèi)容類型可以包含在另一個Feature里。這種情況下,我們要注意創(chuàng)建相應(yīng)的激活依賴性

?

內(nèi)容類型架構(gòu)定義位于C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\XML\wss.xsd


點(diǎn)擊查看大圖

?

可以打開ctypewss.xml(位于%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\FEATURES\ctype)。其中包含了大多數(shù)SharePoint內(nèi)置的內(nèi)容類型定義。我們可以將其做為一個很好的學(xué)習(xí)內(nèi)容類型架構(gòu)的例子。


點(diǎn)擊查看大圖

轉(zhuǎn)載于:https://www.cnblogs.com/Sunmoonfire/archive/2010/05/19/1738815.html

總結(jié)

以上是生活随笔為你收集整理的SharePoint2010内容类型剖析(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。