我有一个 WebControl 库,用于渲染我们的风格化表单元素。该库还包含一些重写的验证器,因此当一起使用时,我可以呈现出比默认验证器的 red-star-next-to-a-field 更好的验证 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" ... />
问题:
不幸的是,在向控制树中添加内容时,我遇到了一个问题 22:
将它添加到父级(这将提供一个工作控制树)会导致无法干扰其控制集的错误。
protected override void CreateChildControls()
{
...
Parent.Controls.Add(_someValidator);
}
并将其添加到控件会导致无法找到ControlToValidate的错误。
protected override void CreateChildControls()
{
...
Controls.Add(_someValidator);
}
我该如何构造它,以便我可以让 BasicTextInputLine 创建自己的验证器,并让它验证自己,而不是它的内部 TextBox?
非常感激。