我想根据Visibility
的结果制作小组true
false
或Func
。
我有一个包含控件的页面,如下面的代码所示:
<asp:Panel ID="Panel2" runat="server">
<asp:Panel ID="Panel3" runat="server">
<c:PermissionPanel ID="P1" runat="server" ValidationGroup="Val1">
Validation Group 1 - OK
</c:PermissionPanel>
</asp:Panel>
</asp:Panel>
<c:PermissionPanel ID="P2" runat="server" ValidationGroup="Val1">
Validation Group 1 - OK
</c:PermissionPanel>
<hr />
<c:PermissionPanel ID="P3" runat="server" ValidationGroup="Val2">
Validation Group 2 - OK
</c:PermissionPanel>
<asp:Panel ID="Panel4" runat="server">
<asp:Panel ID="Panel1" runat="server">
<c:PermissionPanel ID="P4" runat="server" ValidationGroup="Val2">
Validation Group 2 - OK
</c:PermissionPanel>
</asp:Panel>
</asp:Panel>
简而言之,我有4 PermissionPanel
可以在其他控件中。
PermissionPanel
的代码如下:
public class PermissionPanel : Panel
{
public delegate bool OnValidate();
public event OnValidate Validate;
public string ValidationGroup { get; set; }
protected override void OnPreRender(EventArgs e)
{
this.Visible = (Validate != null ? Validate() : false);
base.OnPreRender(e);
}
}
我希望从页面中获取所有PermissionPanel
,并根据其组添加事件,例如:
protected void Page_Load(object sender, EventArgs e)
{
// Magic code here. Linq is very welcome
// GetPageControls<PermissionPanel>("Val1").AddEvent(() => return true);
// GetPageControls<PermissionPanel>("Val2").AddEvent(() => return false);
}
上面的代码会使ValidationGroup
== Val1
的所有面板都可见,而Val2
则无法呈现。
所以问题是:我怎样才能做到这一点?有没有更好的方法呢?
简而言之,我想添加一个Func
,这将是一个验证方法,允许显示或不显示面板。一个真实的例子是:
// If post owner is the logged user, show controls like edit and delete
() => return (user != null && user.ID == post.UserID);
答案 0 :(得分:2)
我有两种方法可以识别:搜索或自行注册。在搜索中,您将获取控件层次结构中的每个控件,从页面开始,递归并检查它是否为PermissionPanel
。
第二种方式,我喜欢自我注册,您将更新PermissionPanel
以在Page.Items
内的列表中注册自己,并仅为此列表中的控件注册验证处理程序。
在PermissionPanel
上你可以这样做:
protected override void CreateChildControls()
{
base.CreateChildControls();
List <PermissionPanel> panels;
if (Page.Items["PermissionPanels"] == null)
Page.Items["PermissionPanels"] = panels = new List <PermissionPanel>();
else
panels = Page.Items["PermissionPanels"] as List <PermissionPanel>;
panels.Add(this);
}
在OnPreRender页面上,您可以根据验证组迭代Page.Items["PermissionPanels"]
并注册验证处理程序。