2010-10-08 133 views
3

我想根据Func的结果制作面板Visibilitytruefalse如何使用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); 

回答

2

有两种方式I'm意识到:搜索自行注册。在搜索中,您将从页面开始获取控件层次结构中的每个控件,递归地检查它是否为PermissionPanel

第二种方法,我喜欢你的自我注册将更新PermissionPanelPage.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"]和注册确认处理程序。

+0

我想这是最有效的方法。我注意到,如果在“Repeater”或其他列表控件中使用,我需要小心。如果我在'ItemDataBound'上添加事件,我需要检查它,当前控件是控件列表中控件的父项。但就是这样,我已经实现了这个方法。谢谢! – BrunoLM 2010-10-08 19:05:41

相关问题