用于有条件地呈现嵌套HTML的简单用户控件

时间:2010-04-22 22:15:40

标签: c# asp.net sharepoint user-controls

我想做的是,能够将两个属性传递给用户控件,ListName和Permission,如下所示:

<uc:check id="uc" List="Shared Documents" Permission="OpenItems" runat="server">
  <!-- have some HTML content here that is rendered if the permission is true -->
</uc:check>

然后在实际的检查用户控件中,有类似于:

的内容
<%@ Control language="C#" ClassName="check" %>
<% 
  // determine permission magic placeholder
  if (DoesUserHavePermissions(perm))
  {
    // render nested HTML content
  }
  else
  {
    // abort rendering as to not show nested HTML content
  }
%>

我已经阅读了creating a templated control on MSDN上的页面,虽然这样可行 - 但对于我想要做的事情来说,这似乎有点矫枉过正。是否有一个控件已经基于布尔表达式或更简单的模板示例呈现内容?

http://msdn.microsoft.com/en-us/library/36574bf6.aspx

更新

可以在ascx中使用以下代码来建模一个非常简单的版本:

<%@ Control Language="C#" ClassName="PermissionCheck" %>
<%@ Import Namespace="System.ComponentModel"  %>
<script runat="server">
    void Page_Init()
    {
        if (Allowed != null)
        {
            Panel container = new Panel();
            Allowed.InstantiateIn(container);
            PermissionBasedMessage.Controls.Add(container);
        }
    }

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate Allowed { get; set; }
</script>
<asp:Placeholder runat="server" ID="PermissionBasedMessage" />

注意:我过分简化了此示例代码的Page_Init方法中的检查。可以根据需要添加额外的逻辑检查。

并在调用HTML页面中引用它:

<%@ Register src="PermissionCheck.ascx" tagname="PermissionCheck" tagprefix="uc1" %>

<uc1:PermissionCheck ID="PermissionCheck1" runat="server">
  <Allowed>Allowed Access</Allowed>
</uc1:PermissionCheck>

4 个答案:

答案 0 :(得分:3)

您可以创建自定义控件而不是用户控件:从asp.net面板派生,添加两个属性,然后仅在用户具有所需权限时呈现控件。例如。像这样的东西:

控件(例如将其放在App_Code中):

namespace MyControls
{
    public class MyPanel : Panel
    {
        public string Permission { get; set; }
        public string List { get; set; }
        protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
            if (UserHasPermission()) base.Render(writer);
        }
    }
}

使用控件:

<%@ Page ... %>
<%@ Register Namespace="MyControls" TagPrefix="mc" %>
<html>
...
    <mc:MyPanel runat="server" List="Shared Documents" Permission="OpenItems">
        put content and/or other controls here
    </mc:MyPanel>
...

答案 1 :(得分:2)

为什么不扩展LiteralControl,为你的设置添加属性,然后将html渲染到LieralControl的.Value?看起来非常简单,并且比使用模板化控件更令人头疼

答案 2 :(得分:1)

使用占位符控件包装您的内容并将控件的可见性设置为true或false(具有.Visible = false的控件不会呈现任何html)

&lt; asp:PlaceHolder id =“phWrapper”runat =“server”&gt;
...
&LT; / ASP:占位符&GT;

然后在你的代码隐藏集中phWrapper.Visible = DoesUserHavePermissions(perm);

希望有所帮助!

答案 3 :(得分:1)

其他答案适用于您的问题的通用形式,但是为了检查权限,SPSecurityTrimmedControl可能会执行您所需的操作。