自定义格式的验证错误&控制树问题 - ASP.NET

时间:2009-11-24 07:47:07

标签: c# asp.net validation web-controls

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

非常感谢。

1 个答案:

答案 0 :(得分:1)

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

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

    私人MyRequiredFieldValidator _someValidator;

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

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

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

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

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