リストを含む SharePoint 2010 ページがあります。リストにはいくつかのアイテムと「部門」という名前のフィールドがあり、ユーザー プロファイルから取得したユーザーの部門値に基づいてアイテムをフィルター処理する必要があります。
これを行うために、アクティベーション時に UserContextFilterWebPart をページに追加し、UserContextFilterWebPart と XsltListViewWebPart を接続する機能を作成しました。この機能を有効にすると、ページ デザイン モードで、接続は確立されているがリストが空になることがわかります。次に、Web パーツのメニューを開き、[接続]、[フィルター値の送信先] の順に選択して、[List1] をクリックします。ダイアログが表示されたら、何もせずに「完了」ボタンをクリックするだけで、正常に動作し始めます。手動で追加のアクションを実行した場合にのみ接続が機能し始める理由を誰か説明してもらえますか? 修正するには何をする必要がありますか?
List.Views[0].Query プロパティが適切な CAML クエリに設定されているときに別の方法を試してみましたが、それも正常に機能します。しかし、パフォーマンスと並列タスクの問題のため、これは良いアプローチではないと言われています。それは本当に悪い行動ですか?以下は、2 つの異なるアプローチのコードです。前もって感謝します!
UserContextFilterWebPart を使用した 1-s バリアント:
SPSite Site = new SPSite(URL);
SPWeb Web = Site.OpenWeb();
SPLimitedWebPartManager WPM = Web.GetLimitedWebPartManager(URL, PersonalizationScope.Shared);
XsltListViewWebPart List = WPM.WebParts[0] as XsltListViewWebPart;
UserContextFilterWebPart UCFWP = new UserContextFilterWebPart();
UCFWP.Title = "Current User Filter";
UCFWP.AllowEdit = true;
UCFWP.FilterName = "Current User";
UCFWP.SendEmptyWhenNoValues = true;
UCFWP.AllowClose = true;
UCFWP.ExportMode = WebPartExportMode.All;
UCFWP.AllowConnect = true;
UCFWP.AllowHide = true;
UCFWP.ProfilePropertyName = "Department";
UCFWP.ValueKind = UserContextFilterValueKind.ProfileValue;
UCFWP.ZoneID = "Main";
WPM.AddWebPart(UCFWP, UCFWP.ZoneID, 1);
WPM.SaveChanges(UCFWP);
ConsumerConnectionPointCollection consumerConnections = WPM.GetConsumerConnectionPoints(List);
ConsumerConnectionPoint addConsumerConnPoint = consumerConnections["DFWP Filter Consumer ID"];
ProviderConnectionPointCollection providerConnections = WPM.GetProviderConnectionPoints(UCFWP);
ProviderConnectionPoint addProviderConnPoint = providerConnections["ITransformableFilterValues"];
TransformableFilterValuesToParametersTransformer trans = new TransformableFilterValuesToParametersTransformer();
trans.ConsumerFieldNames = new string[] { "Department" };
trans.ProviderFieldNames = new string[] { "Department" };
SPWebPartConnection newConnection = WPM.SPConnectWebParts(UCFWP, addProviderConnPoint, List, addConsumerConnPoint, trans);
WPM.SPWebPartConnections.Add(newConnection);
CAML クエリを使用した 2 番目のバリアント (機能ではなく Web パーツで使用することを意図しています):
SPSite Site = new SPSite(URL);
SPWeb Web = Site.OpenWeb();
SPLimitedWebPartManager WPM = Web.GetLimitedWebPartManager(URL, PersonalizationScope.Shared);
XsltListViewWebPart List = WPM.WebParts[0] as XsltListViewWebPart;
SPUser CurrentUser = Web.CurrentUser;
SPServiceContext context = SPServiceContext.GetContext(Site);
UserProfileManager upm = new UserProfileManager(context, false);
UserProfile up = upm.GetUserProfile(CurrentUser.RawSid);
String UserDepartment = up["Department"].Value.ToString();
SPView ListView = Web.Lists["List1"].Views[0];
ListView.Query = "<Where><Eq><FieldRef Name='Department' /><Value Type='Text'>" + UserDepartment + "</Value></Eq></Where>";
ListView.Update();