Webpart доступ к большому списку групп - PullRequest
1 голос
/ 22 июня 2010

Я наконец отошел от земли PowerShell к C # материалу для SharePoint.Я создал веб-часть, которую я немного опишу, которая отлично работает на моем сервере разработки, но работает медленно на моем производстве.Разница в том, что на моем производственном сервере более 1400 групп, в то время как в разработке их всего около 20.

Моя веб-часть была создана для решения типичной проблемы: пользователь должен нажимать слишком много раз, чтобы получить доступ к своим элементам.У меня есть библиотека документов, которая имеет 12 основных категорий со многими подпапками под этим.Каждая подпапка по большей части соответствует фактической группе SharePoint.Для каждой основной категории я получаю массив всех подпапок и затем проверяю, существует ли эта группа. Теперь в своем коде ниже я знаю, что замедляет ее.

Есть ли более простой способ увидетьесли группа существует, а не опрашивает весь список групп каждый раз?Я мог бы потенциально опрашивать этот список около 650 раз.

Вот мой код:

protected override void RenderWebPart(HtmlTextWriter output)
{
    try
    {
        #region Connect to the Current Site
        using (SPSite siteCollection = SPContext.Current.Site)
        {
            #region Connect to the tab we want to have this done on
            using (SPWeb oWebsite = siteCollection.OpenWeb("Downloads"))
            {
                #region Find all the items in the list
                foreach (SPListItem item in oWebsite.GetList(oWebsite.ServerRelativeUrl + "/My Files").GetItems(new SPQuery()))
                {
                    string type = Convert.ToString(item["Type"]);
                    string name = Convert.ToString(item["Name"]);

                    #region If this is a legit folder
                    if ((String.IsNullOrEmpty(type)) && (name != "Archived") && (name != "Other"))
                    {
                        #region Get all the sub folders for each main folder
                        foreach (SPFolder SFolder in item.Folder.SubFolders)
                        {
                            #region Then get a list of all groups in SharePoint
                            foreach (SPGroup part in oWebsite.Groups)
                            {
                                #region Then check to see if there is a group with the same name as the folder
                                if (SFolder.Name == part.Name)
                                {
                                    #region Then check to see if the user is in that group
                                    foreach (SPUser vUser in part.Users)
                                    {
                                        string redirectURL = oWebsite.Url + "/My FIles/" + item.Name + "/" + part.Name;
                                        string QSURL = oWebsite.Url + "/My Files/" + item.Name;
                                        bool IsOwner = oWebsite.AssociatedOwnerGroup.ContainsCurrentUser;
                                        bool IsQueryStringNull = String.IsNullOrEmpty(this.Page.Request.QueryString["RootFolder"]);

                                        if ((oWebsite.CurrentUser.ID == vUser.ID) && (IsQueryStringNull))
                                        {
                                            if (IsOwner) { output.Write("If you were not an admin you would be redirected to:" + redirectURL + "<br>"); }
                                            else { this.Page.Response.Redirect(redirectURL, true); }
                                        }

                                        else if ((oWebsite.CurrentUser.ID == vUser.ID) && (!IsQueryStringNull) && (!IsOwner))
                                        {
                                            if (QSURL == this.Page.Request.QueryString["RootFolder"]) { this.Page.Response.Redirect(redirectURL, true); }
                                            else if (redirectURL == this.Page.Request.QueryString["RootFolder"]) { output.Write("User is at the right place :)<br>"); }
                                            else { output.Write("Not Redirecting users: QS is not empty<br>"); }
                                        }
                                    }
                                    #endregion
                                }
                                #endregion
                            }
                            #endregion
                        }
                        #endregion
                    }
                    #endregion
                }
                #endregion
            }
            #endregion
        }
        #endregion
    }
    catch (Exception ex)
    {
        output.Write("ERROR: " + ex);
    }
}

1 Ответ

1 голос
/ 22 июня 2010

Нашел этот в сети.

public static bool GroupExists(SPGroupCollection groups, string name)
{
    if (string.IsNullOrEmpty(name) || (name.Length > 255) || (groups == null) || (groups.Count == 0))
    {
        return false;
    }
    else
    {
        return (groups.GetCollection(new String[] { name }).Count > 0);
    }
}

Это выглядит более эффективно, но я не смогу проверить это, пока автоматизированный процесс не завершится через 20 минут.

...