正在从ASP.NET用户控件的父页验证该控件

本文关键字:控件 验证 用户 ASP NET | 更新日期: 2023-09-27 17:47:47

我有一个带有按钮的asp.net页面。此按钮生成一个用户控件并将其插入到页面中,因此一个页面上可能存在多个控件。我需要验证生成控件中是否存在某个动态生成的控件。

所以。。页面有0到N个控件1。每个控件1可以有0到N个控件2。当在页面上单击SaveButton时,我需要确保每个Control1中至少有1个Control2。

我目前在两个选项之间:

•为生成的每个控件动态插入CustomValidator,每个CustomValidator将验证一个Control1。

•手动进行验证(使用jQuery),从SaveButton.OnClientClick.调用验证函数

两者都有各自的草率之处——这就是为什么我要和大家分享这一点。我是不是错过了简单的解决方案?

提前谢谢。。(顺便说一句,任何达到并包括.NET 3.5 SP1的东西都是公平的游戏)

正在从ASP.NET用户控件的父页验证该控件

嗯,我喜欢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
}

然后,您应该能够将RequiredFieldValidator指向Control1的实例。

您可以尝试的一种方法是创建和维护一个简单的xml结构,该结构表示您的自定义控制层次结构。无论何时创建或销毁自定义用户控件,都可以从此结构中插入或删除。保存后,验证xml结构中表示的控制层次结构是否正确。您可以将xml保存在Session对象中,以便在回发过程中保持它。