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