我有一个WebControl库,我用它来渲染我们的程式化表单元素。该库还包含一些覆盖验证器,因此当它们一起使用时,我可以渲染出比默认验证器的红色星形旁边的字段更好的验证HTML / CSS。也就是说,我想强调整行。
在最基本的层面上,'表格线'可以呈现出来:
<div class="hasError">
<asp:Label>
<asp:TextBox>
(从那里,有各种额外的口哨,AssociatedControlID ...)
我遇到的问题是当控件创建自己的覆盖验证器(例如用 IsRequiredField 属性控制)时,我无法得到验证者的 ControlToValidate 来定位控件本身。
这似乎是验证者的目标 ControlToValidate 需要在控制树中处于同一级别。 我不能把它添加到父母的 控制树期间 CreateChildControls ,因为它会出错。
...所以我有一个这样的课:
[DefaultProperty("Value"), ValidationProperty("Value")]
public class BasicTextInputLine : WebControl, INamingContainer
{
...
private Label _someLabel;
private TextBox _someTextBox;
private MyRequiredFieldValidator _someValidator;
public string Value
public bool IsRequiredField
...
}
(注意 - ValidationProperty(“Value”)标志允许验证器指向它)
和
public class MyRequiredFieldValidator : RequiredFieldValidator
{
...
protected override void OnPreRender(EventArgs e)
{
...
if (foundControlToValidate is BasicTextInputLine)
(foundControlToValidate as BaseFormEntry).IsValid = false;
}
我可以高兴地在标记中工作:
<custom:BasicTextInputLine ID="foo" ... />
<custom:MyRequiredFieldValidator ControlToValidate="foo" ... />
问题:
不幸的是,在向控件树添加内容时,我有一个catch-22:
将它添加到父级(这会产生一个工作的控制树)会产生一个错误,即无法干扰其控制集。
protected override void CreateChildControls()
{
...
Parent.Controls.Add(_someValidator);
}
将其添加到控件中会导致无法找到 ControlToValidate 的错误。
protected override void CreateChildControls()
{
...
Controls.Add(_someValidator);
}
我如何构建这个,以便我可以让BasicTextInputLine创建自己的验证器,让它自己验证,而不是它的内部TextBox?
非常感谢。
答案 0 :(得分:1)
我不确定我是否完全理解这个问题,但是当我解释你的代码片段时,你在这里混合了两个概念:
BasicTextInputLine直接包含验证器。我特别通过类中的变量来获取该信息:
私人MyRequiredFieldValidator _someValidator;
并尝试将其添加到子控件列表中。
验证器是一个完全分离的控件,它引用主BasicTextInputLine。我可以在你的标记中看到:
我认为这两种方法是矛盾的,你有两种选择:
坚持接近1.在这种情况下,您应该在代码中创建验证器实例,并删除标记部分。
坚持接近2.在这种情况下,BasicTextInputLine类不需要知道验证器,即删除类中的变量,不要将其创建为子控件。你根本不需要它。