1.编写插件
1 using Microsoft.Xrm.Sdk; 2 using Microsoft.Xrm.Sdk.Messages; 3 using Microsoft.Xrm.Sdk.Query; 4 using System; 5 using System.Collections.Generic; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 10 namespace Foton.CRM.Plugin.KDClaim 11 { 12 /// <summary> 13 /// 根据安全角色过滤用户可见的视图 14 /// </summary> 15 public class ViewRetrieve : IPlugin 16 { 17 /// <summary> 18 /// 根据权限判断所展示的视图 19 /// </summary> 20 /// <param name="serviceProvider"></param> 21 /// <exception cref="NotImplementedException"></exception> 22 public void Execute(IServiceProvider serviceProvider) 23 { 24 IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); 25 IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); 26 IOrganizationService service = serviceFactory.CreateOrganizationService(null); 27 28 if (context.Depth > 1) 29 return; 30 31 try 32 { 33 #region 获取实体信息 34 RetrieveEntityRequest request; 35 RetrieveEntityResponse response; 36 int? otc = -1; 37 38 request = new RetrieveEntityRequest() 39 { 40 LogicalName = "实体名" 41 }; 42 response = (RetrieveEntityResponse)service.Execute(request); 43 otc = response.EntityMetadata.ObjectTypeCode.Value; 44 #endregion 45 46 #region 获取用户角色 47 Guid currentUserId = context.UserId; 48 EntityCollection userRoles = UserRoleTool.GetCurrentUserRoles(currentUserId, service); 49 50 UserModel user = new UserModel(); 51 foreach (Entity roleItem in userRoles.Entities) 52 { 53 if (roleItem.Attributes.Contains("name") && roleItem.GetAttributeValue<string>("name") == "用户角色1") 54 user.isRole1 = true; 55 if (roleItem.Attributes.Contains("name") && roleItem.GetAttributeValue<string>("name") == "用户角色2") 56 user.isRole2 = true; 57 if (roleItem.Attributes.Contains("name") && roleItem.GetAttributeValue<string>("name") == "用户角色3") 58 user.isRole3 = true; 59 if (roleItem.Attributes.Contains("name") && roleItem.GetAttributeValue<string>("name") == "用户角色4) 60 user.isRole4 = true; 61 } 62 #endregion 63 64 #region 获取视图信息 65 QueryExpression queryExpression = new QueryExpression("savedquery") 66 { 67 ColumnSet = new ColumnSet(true), 68 }; 69 queryExpression.Criteria.AddCondition("name", ConditionOperator.In, "视图1", "视图2", "视图3", "视图4", "快速查找可用视图"); 70 DataCollection<Entity> entities = service.RetrieveMultiple(queryExpression).Entities; 71 72 Dictionary<string, Guid> dic_views = new Dictionary<string, Guid>(); 73 foreach (Entity this_entity in entities) 74 { 75 dic_views.Add(this_entity["name"].ToString(), this_entity.Id); 76 } 77 #endregion 78 79 #region 设置视图权限 80 queryExpression = (QueryExpression)context.InputParameters["Query"]; 81 FilterExpression filterExpression = queryExpression.Criteria.AddFilter(LogicalOperator.Or); 82 83 int? returnedTypeCode = null; 84 foreach (var conditionExpression in queryExpression.Criteria.Conditions) 85 { 86 if (conditionExpression.AttributeName == "returnedtypecode") 87 returnedTypeCode = (int)conditionExpression.Values[0]; 88 } 89 90 if (returnedTypeCode == null) 91 return; 92 else if (returnedTypeCode == otc) 93 if (user.isRole1) 94 { 95 filterExpression.AddCondition("savedqueryid", ConditionOperator.Equal, dic_views["视图1"]); 96 } 97 if (user.isRole2) 98 { 99 filterExpression.AddCondition("savedqueryid", ConditionOperator.Equal, dic_views["视图2"]); 100 filterExpression.AddCondition("savedqueryid", ConditionOperator.Equal, dic_views["(视图4"]); 101 } 102 if (user.isRole3) 103 { 104 filterExpression.AddCondition("savedqueryid", ConditionOperator.Equal, dic_views["视图3"]); 105 } 106 107 filterExpression.AddCondition("savedqueryid", ConditionOperator.Equal, dic_views["快速查找可用视图"]); 108 } 109 else//其他实体 110 return; 111 #endregion 112 113 } 114 catch (Exception ex) 115 { 116 new InvalidOperationException("插件出错!错误原因:" + ex.Message); 117 } 118 119 } 120 121 } 122 }
2.注册插件:
需要注册在实体savedquery下,注册RetrieveMultiple方法执行之前