无法为 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 上的文档设置权限的主要内容,如果未能解决你的问题,请参考以下文章