sharepoint 2010 记录管理 对象模型
首先说一下什么是记录管理:这里有详细的说明
在 网站设置-》网站集管理-》网站集功能 中启用 “现场记录管理”
启用现场记录管理后在 网站管理 中多了2个功能“内容管理器设置” 和“内容管理器规则”
选择一个列表的库设置-》记录声明设置:
然后再文档-》项目中会出现 申明记录
声明为记录后 默认是不能修改和删除, 如果要取消声明 也需要相应的代码
声明为记录后:
如果我们直接删除会有 声明后果了:
其实 文档的修改也有类似的情况。为什么会这样了?
让我们定位到 网站设置-》网站集管理-》记录声明设置:
1)声明记录和取消声明
声明记录方法: Records.DeclareItemAsRecord(item)
取消声明记录: Records.UndeclareItemAsRecord(item)
这里需要引用一些相关的DLL:
Microsoft.Office.DocumentManagement
Microsoft.Office.Policy
主要代码如下:
private static void RecordTest() { using (SPSite site = new SPSite(siturl)) { SPWeb web = site.RootWeb; SPList list = web.GetList(SharePointListURL); SPFolder folder = web.Folders[SharePointListURL]; Stream fileStream = File.Open(filePath, FileMode.Open); SPFile file = list.RootFolder.Files.Add(fileSharePointURL, fileStream); SPListItem item = file.Item; file.Update(); Console.WriteLine("In Place Records enabled: " + Records.IsInPlaceRecordsEnabled(site).ToString()); //Declare the item as a record Records.DeclareItemAsRecord(item); //Make sure it declared object dateObject = item[Expiration.ExpirationDateFieldInternalName]; if (dateObject == null) { Console.WriteLine("Not declared!"); } else { DateTime date = (DateTime)dateObject; Console.WriteLine("Declared Expiration Date: " + date.ToShortDateString() + " " + date.ToShortTimeString()); //Also show if Record using IsRecord Console.WriteLine("IsRecord: " + Records.IsRecord(item)); //Could also use OnHold to check if on hold } //Undeclare the object Records.UndeclareItemAsRecord(item); web.Close(); } }
2)创建保留计划
如果想在列表上创建一个保留策略,首先要检查列表手否有自定义策略,这个需要Microsoft.Office.RecordsManagement.InformationPolicy.ListPolicySettings对象的ListHasPolicy属性,,返回值表示列表是否具有自定义策略。要想将列表设置为使用一个自定义策略,只需要将UseListPolicy设置为true,然后调用update方法。主要代码如下:
private static void PolicyList() { using (SPSite site = new SPSite(siturl)) { SPWeb web = site.RootWeb; SPList list = web.GetList(SharePointListURL); SPFolder folder = web.Folders[SharePointListURL]; SPWeb parentWeb = list.ParentWeb; SPList parentList = parentWeb.Lists[folder.ParentListId]; ListPolicySettings listPolicySettings = new ListPolicySettings(parentList); string policyXml = @" <Schedules nextStageId='4' default='false'> <Schedule type='Default'> <stages> <data stageId='1' recur='True' offset='6' unit='months'> <formula id='Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Formula.BuiltIn'> <number>6</number> <property>Created</property> <period>months</period> </formula> <action type='action' id='Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Action.DeletePreviousVersions' /> </data> <data stageId='2'> <formula id='Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Formula.BuiltIn'> <number>6</number> <property>Modified</property> <period>months</period> </formula> <action type='action' id='Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Action.Record' /> </data> </stages> </Schedule> <Schedule type='Record'> <stages> <data stageId='3'> <formula id='Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Formula.BuiltIn'> <number>3</number> <property>Created</property> <period>years</period> </formula> <action type='action' id='Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Action.Delete' /> </data> </stages> </Schedule> </Schedules> "; if (!listPolicySettings.UseListPolicy) { //Enable Location Based Policy if it isn't enabled listPolicySettings.UseListPolicy = true; listPolicySettings.Update(); //Refresh to get the updated ListPolicySettings listPolicySettings = new ListPolicySettings(parentList); } listPolicySettings.SetRetentionSchedule(folder.ServerRelativeUrl, policyXml, "My Custom Retention"); listPolicySettings.Update(); Console.WriteLine(listPolicySettings.GetRetentionSchedule(folder.ServerRelativeUrl)); web.Close(); } }
这里的保留策略是与列表绑定的,一搬建议与内容类型绑定。
private static void PolicyContentType() { using (SPSite site = new SPSite(siturl)) { SPWeb web = site.RootWeb; SPList list = web.GetList(SharePointListURL); SPFolder folder = web.Folders[SharePointListURL]; SPWeb parentWeb = list.ParentWeb; SPList parentList = parentWeb.Lists[folder.ParentListId]; ListPolicySettings listPolicySettings = new ListPolicySettings(parentList); string policyXml = @" <Schedules nextStageId='4' default='false'> <Schedule type='Default'> <stages> <data stageId='1' recur='True' offset='6' unit='months'> <formula id='Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Formula.BuiltIn'> <number>6</number> <property>Created</property> <period>months</period> </formula> <action type='action' id='Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Action.DeletePreviousVersions' /> </data> <data stageId='2'> <formula id='Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Formula.BuiltIn'> <number>6</number> <property>Modified</property> <period>months</period> </formula> <action type='action' id='Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Action.Record' /> </data> </stages> </Schedule> <Schedule type='Record'> <stages> <data stageId='3'> <formula id='Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Formula.BuiltIn'> <number>3</number> <property>Created</property> <period>years</period> </formula> <action type='action' id='Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Action.Delete' /> </data> </stages> </Schedule> </Schedules> "; SPContentType contentType = web.ContentTypes["文档"]; Policy policy = Policy.GetPolicy(contentType); //Check to see if it exists, if not create it if (policy == null) { Policy.CreatePolicy(contentType, null); policy = Policy.GetPolicy(contentType); } PolicyItem retentionPolicy = policy.Items[Expiration.PolicyId]; //See if a policy already exists, if not create one if (retentionPolicy == null) { policy.Items.Add(Expiration.PolicyId, policyXml); policy.Update(); } else { retentionPolicy.CustomData = policyXml; retentionPolicy.Update(); } //Return back policy XML to make sure it worked retentionPolicy = policy.Items[Expiration.PolicyId]; Console.WriteLine("Policy XML: " + retentionPolicy.CustomData.ToString()); web.Close(); } }
运行后的结果如下:
首先定位到“网站内容类型” -》文档-》信息管理策略设置:
3)创建组织器规则
必须使用Microsoft.Office.RecordsManagement.RecordsRepository.EcmDocumentRoutingWeb对象。必须在站点功能设置中激活内容组织器功能.
网站操作->管理网站功能:
如果想基于一个唯一的属性实现自动折叠,那么可以使用DocumentRouterAutoFolderSettings类,主要代码如下:
public static void PolicyTest() { using (SPSite site = new SPSite(siturl)) { SPWeb web = site.RootWeb; SPList list = web.GetList(SharePointListURL); SPFolder folder = web.Folders[SharePointListURL]; SPWeb parentWeb = list.ParentWeb; EcmDocumentRoutingWeb router = new EcmDocumentRoutingWeb(web); foreach (EcmDocumentRouterRule rule in router.RoutingRuleCollection) { string s = "Alias:" + rule.Aliases + " AFP:" + rule.AutoFolderPropertyName + " Cond:" + rule.ConditionsString + " CTS:" + rule.ContentTypeString + " CR:" + rule.CustomRouter + " PRI:" + rule.Priority + " TP:" + rule.TargetPath + " Name:" + rule.Name + " Desc:" + rule.Description; DocumentRouterAutoFolderSettings autoFolder = rule.AutoFolderSettings; s += "name Format: " + autoFolder.AutoFolderFolderNameFormat + " PropID:" + autoFolder.AutoFolderPropertyId.ToString() + " InternalName:" + autoFolder.AutoFolderPropertyInternalName + " PropName:" + autoFolder.AutoFolderPropertyName + " TypeasString:" + autoFolder.AutoFolderPropertyTypeAsString + " MaxItem:" + autoFolder.MaxFolderItems.ToString() + " Term:" + autoFolder.TaxTermStoreId.ToString(); Console.WriteLine(s); } SPContentType contentType = web.ContentTypes["问题"]; string contentString = contentType.Id.ToString() + "|" + contentType.Name; SPField fieldname = contentType.Fields["标题"]; string fieldNamestring = fieldname.Id.ToString() + "|" + fieldname.InternalName + "|" + fieldname.Title; EcmDocumentRouterRule newRule = new EcmDocumentRouterRule(web); newRule.Name = "Custom Category Rule"; newRule.Description = "Created by Gavin"; newRule.Priority = "5"; newRule.ContentTypeString = contentString; newRule.TargetPath = "/SiteCollectionDocuments"; newRule.ConditionsString = @"<Conditions> <Condition Column='8553196d-ec8d-4564-9861-3dbe931050c8|FileLeafRef|Name' Operator='IsNotEqual' Value='NotEqualTo' /> <Condition Column='8553196d-ec8d-4564-9861-3dbe931050c8|FileLeafRef|Name' Operator='GreaterThan' Value='GreaterTha=' /> <Condition Column='8553196d-ec8d-4564-9861-3dbe931050c8|FileLeafRef|Name' Operator='LessThan' Value='LessThan' /> <Condition Column='8553196d-ec8d-4564-9861-3dbe931050c8|FileLeafRef|Name' Operator='GreaterThanOrEqual' Value='GreaterThanEqual' /> <Condition Column='8553196d-ec8d-4564-9861-3dbe931050c8|FileLeafRef|Name' Operator='LessThanOrEqual' Value='LessThanOrEqua=' /> <Condition Column='8553196d-ec8d-4564-9861-3dbe931050c8|FileLeafRef|Name' Operator='BeginsWith' Value='BeginsWith' /> </Conditions>"; SPField customField = contentType.Fields["说明"]; DocumentRouterAutoFolderSettings afaoler = newRule.AutoFolderSettings; afaoler.Enabled = true; afaoler.AutoFolderPropertyInternalName = customField.InternalName; afaoler.AutoFolderPropertyId = customField.Id; afaoler.AutoFolderPropertyName = customField.Title; afaoler.AutoFolderPropertyTypeAsString = customField.TypeAsString; afaoler.AutoFolderFolderNameFormat = "%1-%2"; newRule.Enabled = true; router.RoutingRuleCollection.Add(newRule); } }
运行结果如图:
网站管理 ->内容管理器规则
不知道为什么这里用“问题”内容内型后规则不能编辑,之间用自定义的内容内型是没有问题的。
正过代码需要几个常量定义
public const string siturl="http://center.beauty.com/";
private const string SharePointListURL = "http://center.beauty.com/Documents/";
private const string filePath = @"c:\demo.docx";
private const string fileSharePointURL = "http://center.beauty.com/Documents/demo.docx";
这里也附加一段 删除自定义内容内型的代码:
public static void RemoveContentType() { using (SPSite siteCollection = new SPSite(siturl)) { using (SPWeb webSite = siteCollection.OpenWeb()) { // Get the obsolete content type. SPContentType obsolete = webSite.ContentTypes["CustomDC"]; // We have a content type. if (obsolete != null) { IList<SPContentTypeUsage> usages = SPContentTypeUsage.GetUsages(obsolete); // It is in use. if (usages.Count > 0) { Console.WriteLine("The content type is in use in the following locations:"); foreach (SPContentTypeUsage usage in usages) Console.WriteLine(usage.Url); } // The content type is not in use. else { // Delete it. Console.WriteLine("Deleting content type {0}...", obsolete.Name); webSite.ContentTypes.Delete(obsolete.Id); } } // No content type found. else { Console.WriteLine("The content type does not exist in this site collection."); } } } Console.Write("\nPress ENTER to continue..."); Console.ReadLine(); }