0

リストを含む 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();
4

1 に答える 1

2

2 つの Web パーツを接続するという同様の問題がありました。ここで答えを見つけました:http://kvdlinden.blogspot.dk/2011/02/programmatically-connect-two.html

その投稿では、2 つの XsltListViewWebParts を使用してそれを行う方法が説明されていることに注意してください。あなたの場合にそれを使用するには、次のことをお勧めします。

  1. 接続を手動で作成し、
  2. PowerShell を使用して、ページの SPLimitedWebPartManager を取得します。
  3. マネージャーを使用して、manager.SPWebPartConnections を反復処理します。
  4. そして、接続の ProviderConnectionPointID を見つけます。
  5. 投稿に示されているコードでその ID を使用します。
  6. また、トランスフォーマーをセットアップすることも忘れないでください。これは、SPWebPartConnections からも見つけることができます。

次回機能をアクティブ化すると、手動で作成したものと同じ接続が得られるはずです。

于 2012-06-18T10:36:08.017 に答える