7

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

所以..Page 有 0 到 N 个 Control1。每个 Control 1 可以有 0 到 N 个 Control2。当在 Page 上单击 SaveButton 时,我需要确保每个 Control1 中至少有 1 个 Control2。

我目前在两个选项之间:

• 为每个生成的控件动态插入CustomValidators,每个控件都会验证一个Control1。

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

两者都以自己的方式草率——这就是我与大家分享这个的原因。我错过了简单的解决方案吗?

在此先感谢..(顺便说一句 - 包括 .NET 3.5 SP1 在内的任何东西都是公平的游戏)

4

4 回答 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;
    }

}

可能有更好的方法来写这个,但它应该给你足够的想法来开始。

于 2008-11-01T23:30:42.420 回答
2

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

于 2008-11-01T18:56:18.323 回答
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 的一个实例。

于 2008-11-21T16:39:35.717 回答
0

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

于 2008-11-01T18:36:13.903 回答