我严重陷入了这个问题的中间。谷歌搜索了很多,但没有找到解决方案。
我的目标是使用标签,文本框,两个必需的字段验证器和自定义验证器创建一个复合控件。我的自定义控制代码如下: -
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace AFGISServerControl
{
[ToolboxData("<{0}:ValidatorTextBox runat="""server"> </{0}:ValidatorTextBox>")]
public class ValidatorTextBox : CompositeControl
{
private TextBox InputTextBox;
private Label InputLabel;
private RequiredFieldValidator RequiredValidator1;
private RequiredFieldValidator RequiredValidator2;
private CustomValidator cv;
private static readonly object EventValidateKey = new object();
protected override void OnLoad(EventArgs e)
{
EnsureChildControls();
base.OnLoad(e);
}
protected override void CreateChildControls()
{
Controls.Clear();
InputTextBox = new TextBox();
InputLabel = new Label();
InputTextBox.ID = "inputTextBox";
//InputTextBox.AutoPostBack = true;
RequiredValidator1 = new RequiredFieldValidator();
RequiredValidator1.ID = this.ID + "_RFV1";
RequiredValidator1.ControlToValidate = InputTextBox.ID;
RequiredValidator1.ValidationGroup = string.Empty;
RequiredValidator1.Display = ValidatorDisplay.Dynamic;
RequiredValidator1.ErrorMessage = Caption.ToString() + " is mandatory";
RequiredValidator2 = new RequiredFieldValidator();
RequiredValidator2.ID = this.ID + "_RFV2";
RequiredValidator2.ControlToValidate = InputTextBox.ID;
RequiredValidator2.Display = ValidatorDisplay.Dynamic;
RequiredValidator2.ErrorMessage = Caption.ToString() + " is mandatory";
cv = new CustomValidator();
cv.ID = this.ID + "_CV";
cv.ControlToValidate = InputTextBox.ID;
cv.SetFocusOnError = true;
cv.Display = ValidatorDisplay.Dynamic;
cv.ErrorMessage = this.CustomErrorMessage;
cv.ValidateEmptyText = true;
cv.ServerValidate += new System.Web.UI.WebControls.ServerValidateEventHandler(this.cv_ServerValidate);
this.Controls.Add(InputLabel);
this.Controls.Add(InputTextBox);
this.Controls.Add(RequiredValidator1);
this.Controls.Add(RequiredValidator2);
this.Controls.Add(cv);
}
#region properties
[
Bindable(true),
Category("Default"),
DefaultValue(""),
Description("Value")
]
public string Text
{
get
{
EnsureChildControls();
return InputTextBox.Text;
}
set
{
EnsureChildControls();
InputTextBox.Text = value;
}
}
[
Bindable(true),
Category("Default"),
DefaultValue(""),
Description("Validation Group")
]
public string ValidationGroup
{
get
{
EnsureChildControls();
return InputTextBox.ValidationGroup;
}
set
{
EnsureChildControls();
InputTextBox.ValidationGroup = value;
RequiredValidator2.ValidationGroup = value;
cv.ValidationGroup = value;
}
}
[
Bindable(true),
Category("Default"),
DefaultValue(""),
Description("Error message for the custom validator.")
]
public string CustomErrorMessage
{
get
{
EnsureChildControls();
return cv.ErrorMessage;
}
set
{
EnsureChildControls();
cv.ErrorMessage = value;
}
}
[
Bindable(true),
Category("Default"),
DefaultValue(""),
Description("Validity of custom validator.")
]
public Boolean isValid
{
get
{
EnsureChildControls();
return cv.IsValid;
}
set
{
EnsureChildControls();
cv.IsValid = value;
}
}
[
Bindable(true),
Category("Default"),
DefaultValue(""),
Description("The text for the name label.")
]
public string Caption
{
get
{
EnsureChildControls();
return InputLabel.Text;
}
set
{
EnsureChildControls();
InputLabel.Text = value;
}
}
#endregion
protected override void RecreateChildControls()
{
EnsureChildControls();
}
[
Category("Action"),
Description("Raised on Text Change")
]
public event ServerValidateEventHandler Validate
{
add
{
Events.AddHandler(EventValidateKey, value);
}
remove
{
Events.RemoveHandler(EventValidateKey, value);
}
}
protected virtual void OnValidate(ServerValidateEventArgs args)
{
EventHandler ValidateHandler = (EventHandler)Events[EventValidateKey];
if (ValidateHandler != null)
{
ValidateHandler(this, args);
}
}
protected void cv_ServerValidate(object source, ServerValidateEventArgs args)
{
OnValidate(args);
}
protected override void Render(HtmlTextWriter writer)
{
AddAttributesToRender(writer);
InputLabel.RenderControl(writer);
InputTextBox.RenderControl(writer);
RequiredValidator1.RenderControl(writer);
RequiredValidator2.RenderControl(writer);
cv.RenderControl(writer);
}
}
}
我的aspx代码是
<cc1:ValidatorTextBox ID="ValidatorTextBox1" runat="server" Caption="Service No"
CustomErrorMessage="Not Valid" ValidationGroup="test"
OnValidate="CVText" />
<asp:Button ID="Button1" runat="server" Text="Button" />
aspx.cs
面临的特定问题是
- " onvalidate"事件的方法背后的代码未被解雇
- 必需的字段验证器错误消息仅显示"是强制性的",标题没有前缀。
我会为建议而巨大。
几件事:
- 您需要调用page.validate()或在源控件上发射带有casusesvalidation = true的后备。确保您在执行验证时未指定验证程序或使用"测试"验证程序。
- 在CreateChildControls期间正在设置所需的现场验证器。您的标题是从输入文本中提取的,直到帖子发帖才填写。在加载ViewState之前,您的CreateChildControls可能发生。您可能需要使用JavaScript设置必需的FieldValidator文本,或者在文本更改时使用_textchanged事件处理程序更新错误消息。您采用的方法显然取决于您的特定用例。
断头后,我改变了使用此控件的整个过程。继续使用Ivalidator的使用情况。那是一种有效的方法。