我想根據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