2010-10-08 66 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

相關問題