SharePoint 2010: как извлечь персонализированное свойство веб-части для всех пользователей

Задний план:

У меня есть встроенная настраиваемая веб-часть SharePoint 2010, унаследованная от System.Web.UI.WebControls.WebParts.WebPart, у которой свойство определено следующим образом:

[Personalizable(PersonalizationScope.User)]
[WebBrowsable(true)]
[WebDisplayName("...")]
[WebDescription("...")]
[Category("...")]
public string CustomProp { get; set; }

Власть желает знать стоимость собственности для каждого из 3000 пользователей. Я уже знаком с тем, как использовать SPLimitedWebPartManager, чтобы извлечь свойство либо в общем представлении, либо в моем личном представлении, используя код, подобный следующему:

var pageUrl = "/Pages/SomePage.aspx";
var limitedManager = SPContext.Current.Web.GetLimitedWebPartManager(
    pageUrl,
    PersonalizationScope.User); // or .Shared, if loading the shared value
var webPart = limitedManager.WebParts.OfType<MyWebPart>().FirstOrDefault();
var prop = webPart.CustomProp;

Итак, вопрос:

Я застрял на сборе этой информации для всех пользователей. Предполагая, что у меня уже есть или я знаю, как получить список имен входа или объектов SPUser, как мне получить свойство веб-части для всех пользователей? Я могу использовать предложения на C #, VB.NET или PowerShell.


person kbrimington    schedule 08.03.2012    source источник


Ответы (1)


Попробуйте этот код - я его не тестировал, но думаю, он должен работать.

const string absolutePageUrl = "http://spsite:5000/Pages/SomePage.aspx";

foreach (SPUser user in SPContext.Current.Site.RootWeb.AllUsers.Cast<SPUser>())
{
    if (!user.LoginName.StartsWith("DOMAIN NAME"))
        continue;

    using (SPSite site = new SPSite(absolutePageUrl, user.UserToken))
    using (SPWeb web = site.OpenWeb())
    {
        var mgr = web.GetLimitedWebPartManager(absolutePageUrl, PersonalizationScope.User);
        var webPart = mgr.WebParts.OfType<MyWebPart>().FirstOrDefault();
        var prop = webPart.CustomProp;
    }
}
person Nathan Pitman    schedule 11.03.2012
comment
Спасибо, Натан! Это поставило меня на верный путь. Я развернул решение, которое включало прямой доступ к SQL, но это заставило меня использовать поддерживаемый API! Несколько вещей, и я проголосую за них и помечу их как правильные: замените limitedManager на mgr и измените вызов new SPSite(), чтобы использовать Guid сайта (для (string, usertoken) конструктора не существует). Я опубликую PowerShell адаптации этого кода и моего подхода прямого SQL, отметка как ответ будет вашей после исправления синтаксиса кода. - person kbrimington; 14.03.2012
comment
Ах, спасибо, что указали на это - я переименовал limitedManager. Этот конструктор SPSite действительно существует (msdn.microsoft.com/en-us/library/ ms469253.aspx), но для этого требуется абсолютный URL (поэтому я соответствующим образом обновил). - person Nathan Pitman; 16.03.2012