1

我有一个 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?

非常感激。

4

1 回答 1

1

我不确定我是否完全理解这个问题,但是当我解释你的代码片段时,你在这里混合了两个概念:

  1. BasicTextInputLine 直接包含验证器。我特别通过类中的变量得出该信息:

    私人 MyRequiredFieldValidator _someValidator;

    并且您尝试将其添加到子控件列表中。

  2. 验证器是一个完全分离的控件,它引用主 BasicTextInputLine。我可以在您的标记中看到:

我认为这两种方法是矛盾的,你有两种选择:

  1. 坚持方法 1。在这种情况下,您应该在代码中创建验证器实例,并删除标记部分。

  2. 坚持方法2。在这种情况下,BasicTextInputLine 类不需要知道验证器,即删除类中的变量并且不要将其创建为子控件。你根本不需要它。

于 2011-03-18T23:50:24.527 回答