在List创建的时候自动加上Rating功能
Rating是SharePoint Server 2010新加入的一个功能,可以在List Settings的General Settings分类中找到。
如果你没有看到这个设置,请先创建一个User Profile Service Application,并且确认Social Features是启用的。如下图所示:
对于管理员来说,只需要轻松的进入List设置页面,点击启用Rating就好了。对于一个开发人员,如果你追求把万事万物都放到你的WSP中,编程的方法就必不可少了。
API中并没有这个功能,因为这个启用功能实在过于复杂,借助Reflector,我从“C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI\Microsoft.Office.Server.UserProfiles.dll”中间把中间操作的代码“借鉴”了出来(代码附在最后),这样在项目中就可以方便的使用了。
这样,使用Event Handler,在List创建后,就可以把Rating功能自动启用了。
代码中有2处说明,分别对应代码中2处高亮处:
1. 方法使用问题
代码中方法签名是public static bool EnableRatings(this SPList list, bool repropagate) ,并且是放在一个静态类中的,可是引用的时候却是properties.List.EnableRatings(true)。
这是因为这里使用了Extension Methods,这样做的好处就是使得代码更加容易被理解。
2. SocialRatingManager的问题。
在Event Handler中,由于没有办法得到当前的SPContext或者SPServiceContext,所以要处理这个异常,创建一个特定的SocialRatingManager。
Enjoy SharePoint 2010!
Event Handler代码如下:
public class ListEventReceiver : SPListEventReceiver { /// <summary> /// A list was added. /// </summary> public override void ListAdded(SPListEventProperties properties) { properties.List.EnableRatings(true); base.ListAdded(properties); } }
需要引用的Namespace:
using Microsoft.SharePoint; using Microsoft.SharePoint.Security; using System.Security.Permissions; using Microsoft.Office.Server.SocialData;
核心类代码如下:
public static class SPListUtilities { public static bool EnableRatings(this SPList list, bool repropagate) { if (list == null) { throw new ArgumentNullException("list"); } bool flag = ContainsFieldById(RatingsFeatureConstants.RatingsFieldGuid_AverageRating, list.Fields); bool flag2 = ContainsFieldById(RatingsFeatureConstants.RatingsFieldGuid_RatingCount, list.Fields); bool flag3 = DoAllContentTypesContainField(RatingsFeatureConstants.RatingsFieldGuid_AverageRating, list.ContentTypes, true, true); bool flag4 = DoAllContentTypesContainField(RatingsFeatureConstants.RatingsFieldGuid_RatingCount, list.ContentTypes, true, true); bool flag5 = DoesViewContainField(RatingsFeatureConstants.RatingsFieldGuid_AverageRating, list.DefaultView, list); bool flag6 = DoesViewContainField(RatingsFeatureConstants.RatingsFieldGuid_RatingCount, list.DefaultView, list); if ((flag3 && flag4) && (flag5 && flag6)) { return true; } if (flag || flag2) { DisableRatings(list); } RatingsUtility.EnsureRatingsFieldsForList(list); if (repropagate) { SocialRatingManager srm; try { srm = new SocialRatingManager(SPServiceContext.Current); } catch (ArgumentNullException) { //If called by an event handler, the SPServiceContext.Current would be null, need to Impersonate SPServiceContext srm = new SocialRatingManager(SPServiceContext.GetContext(list.ParentWeb.Site)); } string baseUrl = list.ParentWeb.Url; if (baseUrl.EndsWith("/", StringComparison.OrdinalIgnoreCase)) { baseUrl = baseUrl.TrimEnd(new char[] { '/' }); } foreach (SPListItem item in list.Items) { string itemUrl = item.Url; if (itemUrl.StartsWith("/", StringComparison.OrdinalIgnoreCase)) { itemUrl = itemUrl.TrimStart(new char[] { '/' }); } SPSecurity.RunWithElevatedPrivileges(delegate { srm.PropagateRating(new Uri(baseUrl + "/" + itemUrl)); }); } } return false; } public static void DisableRatings(this SPList list) { SPField fieldById = GetFieldById(RatingsFeatureConstants.RatingsFieldGuid_AverageRating, list.Fields); if (fieldById != null) { list.Fields.Delete(fieldById.InternalName); } SPField field2 = GetFieldById(RatingsFeatureConstants.RatingsFieldGuid_RatingCount, list.Fields); if (field2 != null) { list.Fields.Delete(field2.InternalName); } list.Update(); } [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] internal static bool ContainsFieldById(Guid id, SPFieldCollection fieldColl) { if (GetFieldById(id, fieldColl) == null) { return false; } return true; } private static bool DoAllContentTypesContainField(Guid id, SPContentTypeCollection contentTypes, bool excludeFolderContentTypes, bool dontExcludeDocumentSetContentTypes) { SPContentTypeId id2 = new SPContentTypeId("0x0120"); SPContentTypeId id3 = new SPContentTypeId("0x0120D520"); foreach (SPContentType type in contentTypes) { if ((excludeFolderContentTypes && (type.Id.Equals(id2) || type.Id.IsChildOf(id2))) && (!dontExcludeDocumentSetContentTypes || (!type.Id.Equals(id3) && !type.Id.IsChildOf(id3)))) { continue; } if (!ContainsFieldById(id, type.Fields)) { return false; } } return true; } private static bool DoesViewContainField(Guid id, SPView view, SPList list) { string internalFieldName = GetInternalFieldName(id, list); if (internalFieldName != null) { foreach (string str2 in view.ViewFields) { if (str2 == internalFieldName) { return true; } } } return false; } private static string GetInternalFieldName(Guid id, SPList list) { SPField fieldById = GetFieldById(id, list.Fields); if (fieldById != null) { return fieldById.InternalName; } foreach (SPContentType type in list.ContentTypes) { fieldById = GetFieldById(id, type.Fields); if (fieldById != null) { return fieldById.InternalName; } } return null; } [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] private static SPField GetFieldById(Guid id, SPFieldCollection fieldColl) { try { return fieldColl[id]; } catch (ArgumentException) { return null; } } } internal sealed class RatingsFeatureConstants { // Fields public const string EmptyIconUrl_Name = "Ratings_EmptyIconUrl"; public const string EmptyIconUrl_Value = "/_layouts/Images/RatingsEmpty.png"; public const string FeatureActivated_False_Value = "false"; public const string FeatureActivated_Name = "Ratings_FeatureActivated"; public const string FeatureActivated_True_Value = "true"; public const string ImageStripRtlUrl_Name = "Ratings_ImageStripRtlUrl"; public const string ImageStripRtlUrl_Value = "/_layouts/Images/Ratingsrtl.png"; public const string ImageStripUrl_Name = "Ratings_ImageStripUrl"; public const string ImageStripUrl_Value = "/_layouts/Images/Ratings.png"; public const string LoadingImg = @"<img src=\'/_layouts/images/loading16.gif\'> "; public const string NewRatingIconUrl_Name = "Ratings_NewRatingIconUrl"; public const string NewRatingIconUrl_Value = "/_layouts/Images/RatingsNew.png"; public static readonly Guid RatingsFieldGuid_AverageRating = new Guid("5a14d1ab-1513-48c7-97b3-657a5ba6c742"); public static readonly Guid RatingsFieldGuid_FeatureId = new Guid("915c240e-a6cc-49b8-8b2c-0bff8b553ed3"); public static readonly Guid RatingsFieldGuid_RatingCount = new Guid("b1996002-9167-45e5-a4df-b2c41c6723c7"); // Methods private RatingsFeatureConstants() { } } [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] internal static class RatingsUtility { // Methods public static void EnsureRatingsFieldsForList(SPList list) { if (list == null) { throw new ArgumentNullException("list"); } SPFieldCollection fields = list.Fields; SPFieldCollection availableFields = list.ParentWeb.AvailableFields; if (!fields.Contains(FieldId.AverageRatings)) { SPField field = availableFields[FieldId.AverageRatings]; list.Fields.AddFieldAsXml(field.SchemaXmlWithResourceTokens, true, SPAddFieldOptions.AddFieldToDefaultView | SPAddFieldOptions.AddFieldInternalNameHint | SPAddFieldOptions.AddToAllContentTypes); } if (!fields.Contains(FieldId.RatingsCount) && availableFields.Contains(FieldId.RatingsCount)) { SPField field2 = availableFields[FieldId.RatingsCount]; list.Fields.AddFieldAsXml(field2.SchemaXmlWithResourceTokens, false, SPAddFieldOptions.AddFieldInternalNameHint | SPAddFieldOptions.AddToAllContentTypes); } list.Update(); } } [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)] public sealed class FieldId { // Methods private FieldId() { } // Properties public static Guid AnonymousCacheProfile { get { return new Guid("BD51BBE5-9A06-4195-B385-E04FE47A33C8"); } } public static Guid ArticleDate { get { return new Guid("71316CEA-40A0-49f3-8659-F0CEFDBDBD4F"); } } public static Guid AssociatedContentType { get { return new Guid("b510aac1-bba3-4652-ab70-2d756c29540f"); } } public static Guid AssociatedVariations { get { return new Guid("d211d750-4fe6-4d92-90e8-eb16dff196c8"); } } public static Guid AudienceTargeting { get { return new Guid("61cbb965-1e04-4273-b658-eedaa662f48d"); } } public static Guid AuthenticatedCacheProfile { get { return new Guid("9A36D6C6-F7D4-4cce-8923-AD99A44E2F5B"); } } public static Guid AutomaticUpdate { get { return new Guid("e977ed93-da24-4fcc-b77d-ac34eea7288f"); } } public static Guid AverageRatings { get { return new Guid("5a14d1ab-1513-48c7-97b3-657a5ba6c742"); } } public static Guid ByLine { get { return new Guid("D3429CC9-ADC4-439b-84A8-5679070F84CB"); } } public static Guid CacheAllowWriters { get { return new Guid("773ED051-58DB-4ff2-879B-08B21AB001E0"); } } public static Guid CacheAuthenticatedUse { get { return new Guid("0A90B5E8-185A-4dec-BF3C-E60AAE08373F"); } } public static Guid CacheCacheability { get { return new Guid("18f165be-6285-4a57-b3ab-4e9f913d299f"); } } public static Guid CacheCheckForChanges { get { return new Guid("5b4d927c-d383-496b-bc79-1e61bd383019"); } } public static Guid CacheDisplayDescription { get { return new Guid("9550e77a-4d10-464f-bc0c-102d5b1aec42"); } } public static Guid CacheDisplayName { get { return new Guid("983f490b-fc53-4820-9354-e8de646b4b82"); } } public static Guid CacheDuration { get { return new Guid("bdd1b3c3-18db-4acf-a963-e70ef4227fbc"); } } public static Guid CacheEnabled { get { return new Guid("d8f18167-7cff-4c4e-bdbe-e7b0f01678f3"); } } public static Guid CachePerformAclCheck { get { return new Guid("db03cb99-cf1e-40b8-adc7-913f7181dac3"); } } public static Guid CacheVaryByCustom { get { return new Guid("4689a812-320e-4623-aab9-10ad68941126"); } } public static Guid CacheVaryByHeader { get { return new Guid("89587dfd-b9ca-4fae-8eb9-ba779e917d48"); } } public static Guid CacheVaryByParam { get { return new Guid("b8abfc64-c2bd-4c88-8cef-b040c1b9d8c0"); } } public static Guid CacheVaryByRights { get { return new Guid("d4a6af1d-c6d7-4045-8def-cefa25b9ec30"); } } public static Guid Contact { get { return new Guid("aea1a4dd-0f19-417d-8721-95a1d28762ab"); } } public static Guid ContentType { get { return SPBuiltInFieldId.ContentType; } } public static Guid ContentTypeId { get { return SPBuiltInFieldId.ContentTypeId; } } public static Guid CreatedBy { get { return SPBuiltInFieldId.Author; } } public static Guid CreatedDate { get { return SPBuiltInFieldId.Created; } } public static Guid DeclaredRecord { get { return new Guid("F9A44731-84EB-43a4-9973-CD2953AD8646"); } } public static Guid Description { get { return SPBuiltInFieldId.Comments; } } public static Guid DocumentId { get { return new Guid("AE3E2A36-125D-45d3-9051-744B513536A6"); } } public static Guid DocumentIdPersistId { get { return new Guid("C010D384-479C-494f-968C-C413DBE3DE29"); } } public static Guid DocumentIdUrl { get { return new Guid("3B63724F-3418-461f-868B-7706F69B029C"); } } public static Guid ExemptFromPolicy { get { return new Guid("B0227F1A-B179-4D45-855B-A18F03706BCB"); } } public static Guid ExpirationDate { get { return new Guid("ACD16FDF-052F-40F7-BB7E-564C269C9FBC"); } } public static Guid ExpirationDateSaved { get { return new Guid("74E6AE8A-0E3E-4DCB-BBFF-B5A016D74D64"); } } public static Guid ExpiryDate { get { return new Guid("a990e64f-faa3-49c1-aafa-885fda79de62"); } } public static Guid HeaderStylesDefinitions { get { return new Guid("a932ec3f-94c1-48b1-b6dc-41aaa6eb7e54"); } } public static Guid Hidden { get { return new Guid("7581e709-5d87-42e7-9fe6-698ef5e86dd3"); } } public static Guid HoldRecordStatus { get { return new Guid("3AFCC5C7-C6EF-44f8-9479-3561D72F9E8E"); } } public static Guid IconOverlay { get { return new Guid("B77CDBCF-5DCE-4937-85A7-9FC202705C91"); } } public static Guid IsLocked { get { return new Guid("740931E6-D79E-44a6-A752-A06EB23C11B0"); } } public static Guid LastModifiedBy { get { return SPBuiltInFieldId.Editor; } } public static Guid LastModifiedDate { get { return SPBuiltInFieldId.Modified; } } public static Guid LocalContactEmail { get { return new Guid("c79dba91-e60b-400e-973d-c6d06f192720"); } } public static Guid LocalContactImage { get { return new Guid("dc47d55f-9bf9-494a-8d5b-e619214dd19a"); } } public static Guid LocalContactName { get { return new Guid("7546ad0d-6c33-4501-b470-fb3003ca14ba"); } } public static Guid MigratedGuid { get { return new Guid("75bed596-0661-4edd-9724-1d607ab8d3b5"); } } public static Guid NotificationListDeliveryDate { get { return new Guid("E5BD81F1-C408-4abe-84E6-2119D568361E"); } } public static Guid NotificationListUrl { get { return new Guid("789A7435-9C89-4d65-A472-D386ABA0EDF4"); } } public static Guid PageLayout { get { return new Guid("0f800910-b30d-4c8f-b011-8189b2297094"); } } public static Guid PreviewImage { get { return new Guid("188ce56c-61e0-4d2a-9d3e-7561390668f7"); } } public static Guid PublishedLinksDescription { get { return new Guid("92BBA27E-EEF6-41aa-B728-6DD9CAF2BDE2"); } } public static Guid PublishedLinksDisplayName { get { return new Guid("C80F535B-A430-4273-8F4F-F3E95507B62A"); } } public static Guid PublishedLinksUrl { get { return new Guid("70B38565-A310-4546-84A7-709CFDC140CF"); } } public static Guid PublishingImageCaption { get { return new Guid("66F500E9-7955-49ab-ABB1-663621727D10"); } } public static Guid PublishingPageContent { get { return new Guid("F55C4D88-1F2E-4ad9-AAA8-819AF4EE7EE8"); } } public static Guid PublishingPageIcon { get { return new Guid("3894ec3f-4674-4924-a440-8872bec40cf9"); } } public static Guid PublishingPageImage { get { return new Guid("3de94b06-4120-41a5-b907-88773e493458"); } } public static Guid RatingsCount { get { return new Guid("b1996002-9167-45e5-a4df-b2c41c6723c7"); } } public static Guid RedirectURL { get { return new Guid("AC57186E-E90B-4711-A038-B6C6A62A57DC"); } } public static Guid ReusableHtml { get { return new Guid("82dd22bf-433e-4260-b26e-5b8360dd9105"); } } public static Guid ReusableText { get { return new Guid("890e9d41-5a0e-4988-87bf-0fb9d80f60df"); } } public static Guid ReusableTextType { get { return new Guid("3a4b7f98-8d14-4800-8bf5-9ad1dd6a82ee"); } } public static Guid RollupImage { get { return new Guid("543BC2CF-1F30-488e-8F25-6FE3B689D9AC"); } } public static Guid ShowInRibbon { get { return new Guid("32E03F99-6949-466a-A4A6-057C21D4B516"); } } public static Guid SpsDescription { get { return new Guid("631ab9cc-6687-488d-ab1d-a65b364a0d44"); } } public static Guid StartDate { get { return new Guid("51d39414-03dc-4bd0-b777-d3e20cb350f7"); } } public static Guid SummaryAudience { get { return new Guid("5f667e57-afc0-44e9-a33f-292b69060e8a"); } } public static Guid SummaryGroup { get { return new Guid("d42659b5-ded6-41da-a941-c66e06f0e574"); } } public static Guid SummaryIcon { get { return new Guid("897e4d29-edcf-42a4-951c-b6dbd6d1701f"); } } public static Guid SummaryImage { get { return new Guid("366ec12a-7e06-48fb-97d3-6d3094b3dcc2"); } } public static Guid SummaryLinks { get { return new Guid("B3525EFE-59B5-4f0f-B1E4-6E26CB6EF6AA"); } } public static Guid SummaryLinks2 { get { return new Guid("27761311-936A-40ba-80CD-CA5E7A540A36"); } } public static Guid TargetItemId { get { return new Guid("c546204c-9a88-41d9-913c-ad32cff7dc73"); } } public static Guid Title { get { return SPBuiltInFieldId.Title; } } public static Guid VariationGroupId { get { return new Guid("914fdb80-7d4f-4500-bf4c-ce46ad7484a4"); } } public static Guid VariationRelationshipLink { get { return new Guid("766da693-38e5-4b1b-997f-e830b6dfcc7b"); } } // Nested Types internal static class Legacy { // Properties public static Guid ImageDimension { get { return new Guid("664151A8-54FF-434c-A59A-401D3A00DD79"); } } public static Guid ImageHeight { get { return new Guid("ABB77A79-8021-405c-8BD1-45403FD6CF98"); } } public static Guid ImageWidth { get { return new Guid("FE5429DC-CD77-4dc4-B24C-C82105AE3B36"); } } public static Guid Thumbnail { get { return new Guid("BCDE52EA-BD4F-4a2a-9F50-3224D3BD2778"); } } } }