我有一个带有按钮的asp.net页面。此按钮生成用户控件并将其插入页面,因此一个页面上可能存在许多控件。我需要验证生成的控件中是否存在某个动态生成的控件。
所以......页面有0到N的Control1。每个Control 1可以有0到N个Control2。当在页面上单击SaveButton时,我需要确保每个Control1中至少有一个Control2。
我目前介于两个选项之间:
•为每个生成的控件动态插入CustomValidators,每个控件都将验证一个Control1。
•手动(使用jQuery)进行验证,从SaveButton.OnClientClick调用验证函数。
两者都以自己的方式草率 - 这就是为什么我要和大家分享这个。我错过了简单的解决方案吗?
提前致谢..(顺便说一下 - 包括.NET 3.5 SP1在内的所有内容都是合理的游戏)
答案 0 :(得分: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;
}
}
可能有更好的方法来写这个,但它应该给你足够的想法开始。
答案 1 :(得分:2)
如果要动态添加用户控件,可以使用Validate函数使每个控件实现相同的接口。这样,您可以将控件加载到页面上每个父控件的占位符中。提交页面时,只需循环遍历占位符中的控件,将它们转换为接口类,然后调用validate函数。我不使用自定义验证器,但您可以使用validate函数返回的对象构建验证错误列表,您可以以您喜欢的方式呈现此验证错误集合。
答案 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
}
然后你应该能够在Control1的一个实例上指出一个RequiredFieldValidator。
答案 3 :(得分:0)
您可以尝试的一种方法是创建和维护一个表示自定义控件层次结构的简单xml结构。在创建或销毁自定义用户控件时,只能在此结构中插入或删除。保存后,验证xml结构中表示的控件层次结构是否正确。您可以将xml保存在Session对象中,以便在回发中保留它。