[英]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?
非常感激。
我不确定我是否完全理解该问题,但是当我解释您的代码片段时,您在这里混入了两个概念:
BasicTextInputLine直接包含验证器。 我特别通过类中的变量派生该信息:
私人MyRequiredFieldValidator _someValidator;
您试图将其添加到子控件列表中。
验证器是一个完全分离的控件,它引用主BasicTextInputLine。 我可以在您的标记中看到这一点:
我认为这两种方法是矛盾的,您有两种选择:
坚持方法1.在这种情况下,您应该在代码中创建验证器实例,并删除标记部分。
坚持方法2。在这种情况下,BasicTextInputLine类不需要了解验证器,即,删除该类内部的变量,而不将其创建为子控件。 您根本不需要它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.