繁体   English   中英

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

[英]Custom formatting of validation errors & control tree issues - ASP.NET

我有一个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" ... />

问题:
不幸的是,在向控件树添加内容时遇到了catch 22:

将其添加到父级(这将提供一个有效的控件树)会产生一个错误,提示您无法干扰其控件集。

protected override void CreateChildControls()
{
  ...
  Parent.Controls.Add(_someValidator);
}

并将其添加到控件中会给出有关无法找到ControlToValidate的错误。

protected override void CreateChildControls()
{
  ...
  Controls.Add(_someValidator);
}

我该如何构造它,以便让BasicTextInputLine创建自己的验证器,并对其进行验证,而不是其内部TextBox?

非常感激。

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

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

    私人MyRequiredFieldValidator _someValidator;

    您试图将其添加到子控件列表中。

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

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

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

  2. 坚持方法2。在这种情况下,BasicTextInputLine类不需要了解验证器,即,删除该类内部的变量,而不将其创建为子控件。 您根本不需要它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM