有客户问我,怎么拿到应用到WebPart上的Audiences。一想很简单,还不就是用AudienceManage通过Audience所对应的GUID来Get吗。谁知道一写才发现了问题,与某个WebPart对应的GUID去哪里找到呢?难道要去Query database?不信WebPart类有这么傻。
查了半天终于发现,WebPart的IsIncludedFilter属性包含了所有应用到WebPart上的Audiences的GUID,它们使用逗号分隔。知道了这个就简单了。
private void button1_Click(object sender, System.EventArgs e)
...{
// Get PortalContext.
TopologyManager tm = new TopologyManager();
PortalSite ps = tm.PortalSites[new Uri("http://testsrv")];
PortalContext pc = PortalApplication.GetContext(ps);
![]()
// Get all WebParts.
SPSite site = new SPSite("http://testsrv");
SPWeb web = site.OpenWeb();
SPWebPartCollection wpcollection = web.GetWebPartCollection("default.aspx", Storage.Shared);
![]()
// Get all audiences for each webpart.
AudienceManager am = new AudienceManager(pc);
foreach(WebPart wp in wpcollection)
...{
if(wp.IsIncludedFilter == string.Empty)
...{
Debug.WriteLine("No Target Audience was selected for " + wp.Title);
}
else
...{
// IsIncludedFilter contains a comma delimited list of audience GUID,
// which format is "'guid1','guid2'"
string[] GUIDs = wp.IsIncludedFilter.Split(',');
![]()
foreach(string GUID in GUIDs)
...{
Audience au = am.GetAudience(new Guid(GUID.Substring(1, GUID.Length - 2)));
if(au != null)
...{
Debug.WriteLine("Target Audience, " + au.AudienceName + ", was selected for " + wp.Title);
ArrayList membership = au.GetMembership();
if(membership != null)
...{
for(int i = 0; i < membership.Count; i++)
...{
Debug.WriteLine(" --" + ((UserInfo)membership[i]).PreferredName);
Debug.WriteLine(" --" + ((UserInfo)membership[i]).Email);
Debug.WriteLine(" --" + ((UserInfo)membership[i]).NTName);
}
}
}
}
}
}
}
打印 | 张贴于 2005-09-20 17:42:00 | Tag:工作




}
}
留言反馈