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)?
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
machte ein zweites Update – peter