从父页面验证ASP.NET用户控件

7
我有一个带按钮的asp.net页面。该按钮会生成并插入用户控件到页面中,因此一个页面上可能存在多个控件。我需要验证在生成的控件内是否存在某个特定动态生成的控件。
所以..页面上有0到N个Control1。每个Control1可以有0到N个Control2。当SaveButton在页面上被点击时,我需要确保每个Control1内至少有1个Control2。
目前我有两个选择:
• 为每个生成的控件动态插入CustomValidators,其中每个验证一个Control1。
• 手动进行验证(使用jQuery),从SaveButton.OnClientClick调用验证函数。
这两种方法都有其缺点 - 这就是为什么我要与大家分享这个问题。我是否错过了简单的解决方案?
提前感谢您的帮助..(顺便说一句 - .NET 3.5 SP1及以下版本均可)
4个回答

8

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

}

可能有更好的编写方式,但这应该足以让你开始了解。


这是一个很好的想法,它会导致页面设计更好。谢谢 :) - JoeB
2
在ASP.Net中,您应该使用IValidator接口,它提供了IsValid、Validate和ErrorMessage。您的验证器应该实现它,在Init触发器中,您需要调用Page.Validators.Add(this)。 - sisve

2
如果您正在动态添加用户控件,可以使每个控件实现相同的接口,并具有一个验证函数。这样,您可以将控件加载到页面上每个父控件的占位符中。在提交页面时,只需循环遍历占位符中的控件,将它们转换为接口类并调用验证函数即可。我不使用自定义验证器,但您可以使用从验证函数返回的对象构建一个验证错误列表,然后以任何您喜欢的方式呈现此验证错误集合。

1

我觉得你可以通过在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 的一个实例。


0
一个方法是创建和维护一个简单的 XML 结构,表示您的自定义控件层次结构。每当创建或销毁自定义用户控件时,就从此结构中插入或删除。保存时,请验证 XML 结构中表示的控件层次结构是否正确。您可以将 XML 保存在 Session 对象中,以便跨回发进行持久化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接