2011-01-16 6 views
2

ich den folgenden Code verwende eine neue Website zu erstellen:Erstellen Sie eine neue Website programmgesteuert und wählen Sie die übergeordnete Website aus? (Sharepoint)

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

       try 
       { 
        newWeb.Update(); 
       } 

NewSiteUrl und newSiteName sind Werte von zwei Textfelder und je nachdem, was Seite, die ich diesen Code verwenden (in einem Web-Teil) der neue Standort wird Sei ein Unterseiten zu dieser Seite.

Ich möchte jetzt in der Lage sein, eine übergeordnete Website auszuwählen, so dass die neue Website überall in der Websitesammlung sitzen kann, nicht nur als Unterwebsite der Website, auf der ich den Webpart verwende.

ich die folgende Funktion erstellt alle Seiten in der Websitesammlung zu erhalten und ein Drop-Down mit dem Namen und URL für jeden Standort

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(); 
} 

Wenn der Benutzer eine Website in der Dropdown-Liste auswählt, bevölkern, ist es möglich, diese URL in newSiteUrl zu verwenden, also entscheiden, wo die neue Website sein soll? Ich bekomme es nicht wirklich funktionieren und die neue Seite wird immer noch eine Unterstation für die aktuelle Seite. Ich denke, es hat mit HttpContext.Current zu tun? Irgendwelche Ideen, wie ich es stattdessen tun sollte?

Es ist das erste Mal, dass ich benutzerdefinierte Webparts schreibe und das Sharepoint-Objektmodell ist momentan etwas überwältigend.

Vielen Dank im Voraus.

Edit: mit aktualisierten Code gibt Fehler: 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: So verwende ich

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); 

Aber wie kann ich für die neu erstellte Website die URL am einfachsten erhalten (angezeigt werden korrekte URL in dem Link, den ich erstelle und verwende, wenn ich Berechtigungen setze)?

Antwort

1

Sie sollten das SPWeb öffnen, das im Dropdown-Menü ausgewählt wurde. Verwenden Sie die Web-IDs als Dropdown-Werte, rufen Sie den Kontext spsite ab und verwenden Sie SPSite.OpenWeb (GUID), um das Web zu öffnen, das als übergeordnetes Element dienen soll. Fügen Sie die neue Web zu, dass Web des Webs:

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

Hallo Colin, danke für Ihre Eingabe. Ich habe meinen Beitrag mit mehr Code aktualisiert (ich setze auch Berechtigungen, wenn die Site erstellt wird), es ist wahrscheinlich nicht der hübscheste Code, aber es funktionierte, bevor ich versuchte, die übergeordnete Site zu setzen. Jetzt erhalte ich den Fehler "Versuch, ein SPWeb-Objekt zu verwenden, das geschlossen oder entsorgt wurde und nicht mehr gültig ist. " Irgendwelche Ideen, wie ich meinen Code ändern sollte? Danke nochmal – peter

+0

machte ein zweites Update – peter

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

könnte das Problem verursachen, wie Sie das Site-Objekt sind Entsorgung, die Sie von SPContext erhalten.

AND Micorosoft Sagt, dass die kontextabhängigen Webs nicht ablegen.

Hoffe das könnte Ihnen helfen

Verwandte Themen