簡體   English   中英

從其父頁面驗證ASP.NET用戶控件

[英]Validating an ASP.NET user control from its parent page

我有一個帶有按鈕的asp.net頁面。 此按鈕生成用戶控件並將其插入頁面,因此一個頁面上可能存在許多控件。 我需要驗證生成的控件中是否存在某個動態生成的控件。

所以......頁面有0到N的Control1。 每個Control 1可以有0到N個Control2。 當在頁面上單擊SaveButton時,我需要確保每個Control1中至少有一個Control2。

我目前有兩種選擇:

•為生成的每個控件動態插入CustomValidator,每個控件都將驗證一個Control1。

•手動(使用jQuery)進行驗證,從SaveButton.OnClientClick調用驗證函數。

兩者都以自己的方式草率 - 這就是為什么我要和大家分享這個。 我錯過了簡單的解決方案嗎?

在此先感謝..(順便說一句 - 任何包括.NET 3.5 SP1在內的公平游戲)

嗯我喜歡digiguru建議的界面想法,但我會使用容器Control1上的接口而不是子控件,因為它似乎是代碼生存的更合理的位置。 繼承我的看法:

public interface IValidatableControl
{
    bool IsValidControl();    
}

然后在你的Control1上實現這個

public class Control1 : IValidatableControl
{
... Other methods
    public bool IsValidControl()
    {

        foreach(object c in this.Controls)
        {
            if(c.GetType() == "Control2")
                return true;
        }
        return false;
    }

}

可能有更好的方法來寫這個,但它應該給你足夠的想法開始。

如果要動態添加用戶控件,可以使用Validate函數使每個控件實現相同的接口。 這樣,您可以將控件加載到頁面上每個父控件的占位符中。 提交頁面時,只需循環遍歷占位符中的控件,將它們轉換為接口類,然后調用validate函數。 我不使用自定義驗證器,但您可以使用validate函數返回的對象構建驗證錯誤列表,您可以以您喜歡的方式呈現此驗證錯誤集合。

我認為你可以通過在Control1中分配一個引用Control2 ID的公共屬性,然后用ValidationProperty裝飾Control1的類來實現。 我正在考慮以下幾點:

[ValidationProperty("Control2Ref")]
public partial class Control1 : UserControl
{
    public string Control2Ref
    {
        get { return FindControl("Control2"); }
    }
    // rest of control 1 class
}

然后,您應該能夠在Control1的實例上指向RequiredFieldValidator。

您可以嘗試的一種方法是創建和維護一個表示自定義控件層次結構的簡單xml結構。 在創建或銷毀自定義用戶控件時,只能在此結構中插入或刪除。 保存后,驗證xml結構中表示的控件層次結構是否正確。 您可以將xml保存在Session對象中,以便在回發中保留它。

暫無
暫無

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

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