无法为 Visual Web 部件 Sharepoint 2010 Foundation 上的文档设置权限
Posted
技术标签:
【中文标题】无法为 Visual Web 部件 Sharepoint 2010 Foundation 上的文档设置权限【英文标题】:Cannot set permission for documents on Visual web part Sharepoint 2010 Foundation 【发布时间】:2012-12-14 08:26:26 【问题描述】:美好的一天!我有一个事件处理程序,当您将文档添加到库时,它会将用户重定向到带有文档参数的 Web 表单。在 web 表单中,它以 Checkboxlist 的形式显示当前用户。用户选择适当的组,然后按下保存按钮。以下是根据所选组分配给文档的权限。问题是文档的分辨率没有根据选定的组分配。这是处理程序代码:
using System;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.Workflow;
using System.Web;
using System.IO;
namespace SharePointProject3.EventReceiver2
/// <summary>
/// События элемента списка
/// </summary>
public class EventReceiver2 : SPItemEventReceiver
private HttpContext _context;
public EventReceiver2()
_context = HttpContext.Current;
public override void ItemAdding(SPItemEventProperties properties)
//Временно отключаем срабатывание обработчика
EventFiringEnabled = false;
//Получаем файл из HttpContext
HttpPostedFile file = _context.Request.Files[0];
Stream fileStream = file.InputStream;
byte[] fileByte = new byte[file.ContentLength];
fileStream.Read(fileByte, 0, file.ContentLength);
//Загружаем файл в библиотеку документов
SPFile fileUploded = properties.Web.Files.Add(properties.AfterUrl, fileByte);
//Включаем обработчик обратно
EventFiringEnabled = true;
//Отменяем добавление файла, которое делал пользователь
properties.Cancel = true;
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
//Деламе редирект
properties.RedirectUrl = properties.Web.Url + "/test_perm/default.aspx?ID=" + fileUploded.UniqueId;
这是 Web 部件的代码:
using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Text;
using Microsoft.SharePoint.Utilities;
namespace CustomGroupAssignment.VisualWebPart1
public partial class VisualWebPart1UserControl : UserControl
protected void Page_Load(object sender, EventArgs e)
using (SPSite site = new SPSite("http://kviten:83/"))
using (SPWeb web = site.OpenWeb())
SPUser currentUser = web.CurrentUser;
SPDocumentLibrary docLib = (SPDocumentLibrary)web.Lists["Test_Doc_Lib"];
SPGroupCollection webGroups = currentUser.Groups;
CheckBoxList1.DataSource = webGroups;
CheckBoxList1.DataValueField = "ID";
CheckBoxList1.DataTextField = "Name";
CheckBoxList1.DataBind();
foreach (ListItem li in CheckBoxList1.Items)
li.Selected = true;
try
string itemID = Page.Request.Params["ID"];
SPDocumentLibrary doclib = (SPDocumentLibrary)web.GetList(SPUrlUtility.CombineUrl(web.Url, "/DocLib2/Forms/AllItems.aspx"));
SPListItem item = doclib.GetItemByUniqueId(new Guid(itemID));
catch (Exception ex)
//Выводим ошибку
protected void Button1_Click(object sender, EventArgs e)
using (SPSite site = new SPSite("http://kviten:83/"))
using (SPWeb web = site.OpenWeb())
SPUser currentUser = web.CurrentUser;
SPDocumentLibrary docLib = (SPDocumentLibrary)web.Lists["Test_Doc_Lib"];
try
string itemID = Page.Request.Params["ID"];
SPDocumentLibrary doclib = (SPDocumentLibrary)web.GetList(SPUrlUtility.CombineUrl(web.Url, "/Test_Doc_Lib/"));
SPListItem item = doclib.GetItemByUniqueId(new Guid(itemID));
//Break the role inheritance from List and remove any RoleAssignments
//item.BreakRoleInheritance(false);
//while (item.RoleAssignments.Count > 0)
//
// item.RoleAssignments.Remove(0);
//
if (!item.HasUniqueRoleAssignments)
item.ResetRoleInheritance();
item.Update();
item.BreakRoleInheritance(false);
item.Update();
foreach (ListItem li in CheckBoxList1.Items)
if (li.Selected) //Response.Write("- " + li.Text + "<br/>");
// Give permissions to a specific group
SPGroup group = web.Groups.GetByID(Convert.ToInt32(li.Value));
SPPrincipal principalGroup = group;
SPRoleAssignment roleassignment_group = new SPRoleAssignment(group);
SPRoleAssignment roleAssignment = item.RoleAssignments.GetAssignmentByPrincipal(principalGroup);
item.RoleAssignments.Add(roleAssignment);
item.Update();
catch (Exception ex)
//Выводим ошибку
Context.Response.Write("<script type='text/javascript'>window.frameElement.commitPopup();</script>");
Context.Response.Flush();
Context.Response.End();
protected void btnCancel_Click(object sender, EventArgs e)
Context.Response.Write("<script type='text/javascript'>window.frameElement.commitPopup();</script>");
Context.Response.Flush();
Context.Response.End();
我不明白为什么我不能为文档分配权限!请帮忙!
如果使用注释掉的/ / Response.Write ("-" + li.Text + "<br/>");
,我们可以看到复选框没有被选中,也没有显示出来。 item.ResetRoleInheritance();执行并仅将权限分配给没有组的当前用户。可能是什么原因?
【问题讨论】:
【参考方案1】:Web 部件的正确解决方案:
using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Text;
using Microsoft.SharePoint.Utilities;
namespace CustomGroupAssignment.VisualWebPart1
public partial class VisualWebPart1UserControl : UserControl
protected void Page_Load(object sender, EventArgs e)
if (!IsPostBack)
using (SPSite site = new SPSite("http://kviten:83/"))
using (SPWeb web = site.OpenWeb())
SPUser currentUser = web.CurrentUser;
SPDocumentLibrary docLib = (SPDocumentLibrary)web.Lists["Test_Doc_Lib"];
SPGroupCollection webGroups = currentUser.Groups;
CheckBoxList1.DataSource = webGroups;
CheckBoxList1.DataValueField = "ID";
CheckBoxList1.DataTextField = "Name";
CheckBoxList1.DataBind();
foreach (ListItem li in CheckBoxList1.Items)
li.Selected = true;
try
string itemID = Page.Request.Params["ID"];
SPDocumentLibrary doclib = (SPDocumentLibrary)web.GetList(SPUrlUtility.CombineUrl(web.Url, "/DocLib2/Forms/AllItems.aspx"));
SPListItem item = doclib.GetItemByUniqueId(new Guid(itemID));
catch (Exception ex)
//Выводим ошибку
protected void Button1_Click(object sender, EventArgs e)
using (SPSite site = new SPSite("http://kviten:83/"))
using (SPWeb web = site.OpenWeb())
SPUser currentUser = web.CurrentUser;
SPDocumentLibrary docLib = (SPDocumentLibrary)web.Lists["Test_Doc_Lib"];
string itemID = Page.Request.Params["ID"];
SPDocumentLibrary doclib = (SPDocumentLibrary)web.GetList(SPUrlUtility.CombineUrl(web.Url, "/Test_Doc_Lib/"));
SPListItem item = doclib.GetItemByUniqueId(new Guid(itemID));
foreach (ListItem li in CheckBoxList1.Items)
if (li.Selected) //Response.Write("- " + li.Text + "<br/>");
if (!item.HasUniqueRoleAssignments)
item.ResetRoleInheritance();
item.Update();
item.BreakRoleInheritance(false);
item.Update();
SPGroup group = web.Groups.GetByID(Convert.ToInt32(li.Value));
SPPrincipal principalGroup = (SPPrincipal)group;
//SPRoleAssignment roleassignment_group = new SPRoleAssignment(principalGroup);
SPRoleAssignment roleAssignment = item.Web.RoleAssignments.GetAssignmentByPrincipal(principalGroup);
item.RoleAssignments.Add(roleAssignment);
item.Update();
// var roleAssignment = new SPRoleAssignment(principalGroup);
// item.RoleAssignments.Add(roleAssignment);
// item.Update();
Context.Response.Write("<script type='text/javascript'>window.frameElement.commitPopup();</script>");
Context.Response.Flush();
Context.Response.End();
protected void btnCancel_Click(object sender, EventArgs e)
Context.Response.Write("<script type='text/javascript'>window.frameElement.commitPopup();</script>");
Context.Response.Flush();
Context.Response.End();
【讨论】:
以上是关于无法为 Visual Web 部件 Sharepoint 2010 Foundation 上的文档设置权限的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2010、SharePoint 2010、外部 Web 部件
如何在 Sharepoint 2016 中通过 Visual Web 部件更新项目后重新加载列表?
可视化 Web 部件中的 JQuery SharePoint Foundation
我们可以在不使用 Visual Studio 的情况下在 Office 365 Online 中创建 SharePoint 自定义 Web 部件吗?