我想做的是,能够将两个属性传递给用户控件,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>
答案 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可能会执行您所需的操作。