簡體   English   中英

如何使用ValidationGroup創建控件並進行自定義驗證?

[英]How to create a control with ValidationGroup and a custom validation?

我想根據Func的結果使面板Visibility truefalse

我有一個包含控件的頁面,如下面的代碼所示:

<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);

我有兩種方法可以識別: 搜索自我注冊 在搜索中,您將獲取控件層次結構中的每個控件,從頁面開始,遞歸並檢查它是否是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"]並根據您的驗證組注冊驗證處理程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM