我想根据Func
的结果制作面板Visibility
true
或false
。如何使用ValidationGroup和自定义验证创建控件?
我有控制一个网页如下面的代码:
<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
S和每个添加相应的事件,以它的组,例如:
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);
我想这是最有效的方法。我注意到,如果在“Repeater”或其他列表控件中使用,我需要小心。如果我在'ItemDataBound'上添加事件,我需要检查它,当前控件是控件列表中控件的父项。但就是这样,我已经实现了这个方法。谢谢! – BrunoLM 2010-10-08 19:05:41