Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在从父页验证ASP.NET用户控件_C#_Asp.net_Validation_User Controls_Custom Controls - Fatal编程技术网

C# 正在从父页验证ASP.NET用户控件

C# 正在从父页验证ASP.NET用户控件,c#,asp.net,validation,user-controls,custom-controls,C#,Asp.net,Validation,User Controls,Custom Controls,我有一个带有按钮的asp.net页面。此按钮生成用户控件并将其插入页面,因此一个页面上可能存在多个控件。我需要验证生成的控件中是否存在某个动态生成的控件 所以..页面有0到N个控件1。每个控件1可以有0到N个控件2。当在页面上单击SaveButton时,我需要确保每个Control1中至少有一个Control2 我目前有两种选择: •为生成的每个控件动态插入CustomValidator,每个控件将验证一个控件1 •手动执行验证(使用jQuery),从SaveButton.OnClientCli

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

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

我目前有两种选择:

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

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

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


提前谢谢。。(顺便说一句,任何达到或包括.NET 3.5 SP1的内容都是公平的)

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

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

嗯,我喜欢digiguru建议的接口想法,但我会使用容器控件1上的接口,而不是子控件,因为它似乎是代码存在的更符合逻辑的地方。以下是我的看法:

public interface IValidatableControl
{
    bool IsValidControl();    
}
然后在控件1上实现此操作

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

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

}

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

我认为你可以在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的一个实例。

这是一个好主意,它可以更好地设计页面。谢谢:)您应该使用ASP.Net中的IValidator接口,它提供IsValid、Validate和ErrorMessage。验证器应该实现它,在Init触发器中,您需要调用Page.Validators.Add(这个)。