2011-01-16 2 views
2

Я использую следующий код, чтобы создать новый сайт:Создать новый сайт программно и выбрать родительский сайт? (SharePoint)

newWeb = SPContext.GetContext(HttpContext.Current).Web.Webs.Add(newSiteUrl, newSiteName, null, (uint)1033, siteTemplate, true, false); 

       try 
       { 
        newWeb.Update(); 
       } 

NewSiteUrl и newSiteName являются значения из двух текстовых полей и на какой сайт я использую этот код (в веб-части) новый сайт будет быть дочерним сайтом на этом сайте.

Теперь я хотел бы иметь возможность выбрать родительский сайт, чтобы новый сайт мог размещаться где угодно в семействе сайтов, а не как дочерний сайт на сайте, где я использую веб-часть.

Я создал следующую функцию, чтобы получить все сайты в семействе сайтов и заселить выпадающий с именем и URL для каждого сайта

private void getSites() 
{ 
    SPSite oSiteCollection = SPContext.Current.Site; 
    SPWebCollection collWebsite = oSiteCollection.AllWebs; 

    for (int i = 0; i < collWebsite.Count; i++) 
    { 
     ddlParentSite.Items.Add(new ListItem(collWebsite[i].Title, collWebsite[i].Url)); 
    } 
    oSiteCollection.Dispose(); 
} 

Если пользователь выбирает сайт в раскрывающемся списке, это можно использовать этот URL-адрес в newSiteUrl, чтобы решить, где должен быть новый сайт? Я не понимаю, как это работает, и новый сайт по-прежнему становится дочерним сайтом для текущего. Думаю, это связано с HttpContext.Current? Любые идеи о том, как я должен это делать?

Это первый раз, когда я пишу пользовательские веб-части, а объектная модель sharepoint немного подавляющая на данный момент.

Заранее спасибо.

Edit: с обновленным кодом дает ошибку: Trying to use an SPWeb object that has been closed or disposed and is no longer valid.

if (!siteExists(newSiteName) && newSiteName.Length > 0) 
      { 
       using (var parent = SPContext.GetContext(HttpContext.Current).Site) 
       { 
        using(var parentWeb = parent.OpenWeb(new Guid(parentSite))) 
        { 
        newWeb = parentWeb.Webs.Add(newSiteUrl, newSiteName, null, (uint)1033, siteTemplate, true, false); 

       try 
       { 
        newWeb.Update(); 
       } 

       catch 
       { 
        lblErrorCreateSite.Text = "An error occured when trying to create a new site, please try again."; 
       } 
       finally 
       { 

        txtSiteName.Text = ""; 

        // Show link to new site 
        lblNewSite.Text = "A new site was successfully created at "; 
        hplNewSite.Visible = true; 
        hplNewSite.NavigateUrl = siteURL() + newSiteName; 
        hplNewSite.Text = newSiteName; 

        // Dispose to reload the SharePoint content database 
        newWeb.Dispose(); 

       } 

       // Set permissions 
       try 
       { 
        string site = siteURL(); 
        SPSite spSite = new SPSite(site + newSiteName); 
        SPWeb web = spSite.OpenWeb(); 

        // Assign Full Access role to the selected groups 
        string fullAccessGroup = null; 
        string fullAccessRole = null; 
        foreach (ListItem item in lbFullAccess.Items) 
        { 
         fullAccessGroup = item.Value; 
         fullAccessRole = "Full Control"; 
         SPRoleAssignment roleAssignment = new SPRoleAssignment(web.SiteGroups[fullAccessGroup]); 
         SPRoleDefinitionBindingCollection roleDefinition = roleAssignment.RoleDefinitionBindings; 

         roleDefinition.Add(web.RoleDefinitions[fullAccessRole]); 
         web.RoleAssignments.Add(roleAssignment); 
         web.Properties[fullAccessGroup] = fullAccessRole; 
         web.Properties.Update(); 
        } 

        // Assign Contributor role to the selected groups 
        string contributeGroup = null; 
        string contributeRole = null; 
        foreach (ListItem item in lbContributor.Items) 
        { 
         contributeGroup = item.Value.ToString(); 
         contributeRole = "Contribute"; 

         SPRoleAssignment roleAssignment = new SPRoleAssignment(web.SiteGroups[contributeGroup]); 
         SPRoleDefinitionBindingCollection roleDefinition = roleAssignment.RoleDefinitionBindings; 

         roleDefinition.Add(web.RoleDefinitions[contributeRole]); 
         web.RoleAssignments.Add(roleAssignment); 
         web.Properties[contributeGroup] = contributeRole; 
         web.Properties.Update(); 
        } 

        // Assign Reader role to the selected groups 
        string readerGroup = null; 
        string readerRole = null; 
        foreach (ListItem item in lbReadOnly.Items) 
        { 
         readerGroup = item.Value.ToString(); 
         readerRole = "Read"; 

         SPRoleAssignment roleAssignment = new SPRoleAssignment(web.SiteGroups[readerGroup]); 
         SPRoleDefinitionBindingCollection roleDefinition = roleAssignment.RoleDefinitionBindings; 

         roleDefinition.Add(web.RoleDefinitions[readerRole]); 
         web.RoleAssignments.Add(roleAssignment); 
         web.Properties[readerGroup] = readerRole; 
         web.Properties.Update(); 
        } 

       } 
       catch 
       { 
        lblErrorSetPermissions.Text = "Error trying to set permissions for this site, please try again."; 
       } 
       finally 
       { 

       } 

      } 
       } 
      } 
      else 
      { 
       if (siteExists(newSiteName)) 
       { 
        lblErrorCreateSite.Text = "A site with that name already exists. Please select another name.<br/>"; 
       } 

       if (newSiteName.Length == 0) 
       { 
        lblErrorCreateSite.Text = "A Site Name is required.<br/>"; 
       } 

       hplNewSite.Visible = false; 
      } 

Edit2: Поэтому я использую

SPSite currentContext = SPContext.GetContext(HttpContext.Current).Site; 
SPWeb parentID = currentContext.OpenWeb(new Guid(parentSiteValue)); 

newWeb = parentID.Webs.Add(newSiteUrl, newSiteName, null, (uint)1033, siteTemplate, true, false); 

Но как я могу проще всего получить URL для вновь созданного сайта (для отображения правильный url в ссылке, которую я создаю, и использовать, когда я устанавливаю разрешения)?

ответ

1

Вы должны открыть SPWeb, выбранный в раскрывающемся списке. Используйте идентификаторы веб-страниц как выпадающие значения, получите контекстный spsite, затем используйте SPSite.OpenWeb (GUID), чтобы открыть веб-сайт, который вы хотите быть родителем. Добавьте новый веб-к полотнам, Интернета:

private void getSites() 
{ 
    SPSite oSiteCollection = SPContext.Current.Site; 
    SPWebCollection collWebsite = oSiteCollection.AllWebs; 
     for (int i = 0; i < collWebsite.Count; i++) 
    { 
     ddlParentSite.Items.Add(new ListItem(collWebsite[i].Title, collWebsite[i].Id)); 
    } 

    // oSiteCollection.Dispose(); // NEVER DISPOSE THE SPContext.Current.Site or Web 
} 

using(var site = SPContext.GetContext(HttpContext.Current).Site) 
{ 
    using(var parentWeb = site.OpenWeb(new Guid(DDLVALUE)) 
    { 
    newWeb = parentWeb.Webs.Add(newSiteUrl, newSiteName, null, (uint)1033, siteTemplate, true, false); 
    try 
    { 
     newWeb.Update(); 
    } 
    } 
} 
+0

Привет, Колин, спасибо за ваш ввод. Я обновил свой пост с большим количеством кода (я также устанавливаю разрешения при создании сайта), это, вероятно, не самый красивый код, но он работал до того, как я попытался установить родительский сайт. Теперь я получаю сообщение об ошибке «Попытка использовать объект SPWeb, который был закрыт или удален, и больше недействителен. « Любые идеи о том, как мне изменить свой код? Еще раз спасибо – peter

+0

сделал второе обновление – peter

1
using(var site = SPContext.GetContext(HttpContext.Current).Site) 
{ 
} 

может быть причиной проблемы, как вы избавляетесь объект сайта, который вы получили от SPContext.

ANd Micorosoft Говорит, что не удаляйте контекстные сети.

Надеюсь, что может помочь вам

Смежные вопросы