1

我们可以开发一个 webpart 并在共享点站点中部署一些用户上下文。这是特定于用户的。假设如果我们使用只读用户登录,那么我们将收到一条错误消息,说明发生了错误。有没有办法避免这种情况?意思是,如果我们使用只读用户登录,那么该用户应该看不到 webpart。如果登录用户具有完全权限,那么该用户应该可以看到它。

SPSecurity.RunWithElevatedPrivileges 

方法 以完全控制权限执行指定的方法,即使用户没有完全控制权限。像这样有什么方法可以满足我的标准,而不会在网页中显示任何错误。请给我解决方案。谢谢。

4

1 回答 1

3

如果用户没有足够的权限来访问某个资源并停止呈现 Web 部件,您可以做的是处理。

首先,拒绝访问处理:假设您正在访问CreateChildControlsWeb 部件中的资源:

private bool accessDenied;

protected override void CreateChildControls()
{ 
  try
  {
    // prevent SharePoint from catching an access denied exception and 
    // redirecting to the error page.
    using (new SPSecurity.SuppressAccessDeniedRedirectInScope())
    {
      SPContext.Current.Web.Lists["Restriced"] // some thing...
    }
  }
  catch (UnauthorizedAccessException)
  {
    // set variable in case the user has not enough permissions
    accessDenied = true;
  } 
}

现在,我们知道用户是否没有足够的权限来访问资源。下一步是禁用呈现并隐藏 Web 部件及其内容。隐藏 Web 部件很简单。我们需要做的就是覆盖 render 方法并且什么都不做:

protected override void RenderWebPart(HtmlTextWriter writer)
{
  if (accessDenied) return;

  base.RenderWebPart(writer);
}

您也可以显示错误消息。但是,我猜这会破坏目的。

最后一步是禁用 Web 部件的镶边。这可以通过ChromeTypeOnPreRender方法中设置来完成:

protected override void OnPreRender(EventArgs e)
{
  // Important to call base method in order to ensure child controls...
  base.OnPreRender(e);

  if (accessDenied)
  {
    ChromeType = PartChromeType.None;
  }
}

当然,如果您要覆盖 Web 部件中的其他方法,则需要检查是否accessDenied已设置。

于 2012-06-06T08:36:43.063 回答