我有一个看起来像这样的课程:
public class TextField : TextBox
{
public bool Required { get; set; }
RequiredFieldValidator _validator;
protected override void CreateChildControls()
{
base.CreateChildControls();
_validator = new RequiredFieldValidator();
_validator.ControlToValidate = this.ID;
if(Required)
Controls.Add(_validator);
}
public override void Render(HtmlTextWriter tw)
{
base.Render(tw);
if(Required)
_validator.RenderControl(tw);
}
}
这已经在内部应用程序中工作了一段时间,其中始终启用了javascript。我最近注意到上游的javascript错误可以阻止验证器被触发,因此服务器端验证应该启动...对吗?正确?
因此Page.IsValid属性总是返回true(我甚至尝试在事先显式调用Page.Validate())。
经过一番挖掘,我发现验证器初始化方法应该将验证器添加到页面中,但由于我正在构建它的方式,我认为这不会发生。因此,客户端验证可行,但服务器端验证不起作用。
我试过这个:
protected override OnInit()
{
base.OnInit();
Page.Validators.Add(_validator); // <-- validator is null here
}
但是当然验证器在这里是空的(有时它不是必需的,所以不应该添加)...但是OnInit()对于我做出这些决定真的很早(必需的属性不会被例如从ViewState加载。)
想法?
答案 0 :(得分:1)
CreateChildControls基本上用于具有子项的控件。 RequiredFieldValidator就像TextBox的兄弟。
以下是适用于我的代码:
public class RequiredTextBox : TextBox
{
private RequiredFieldValidator _req;
private string _errorMessage;
public string ErrorMessage
{
get { return _errorMessage; }
set { _errorMessage = value; }
}
protected override void OnInit(EventArgs e)
{
_req = new RequiredFieldValidator();
_req.ControlToValidate = this.ID;
_req.ErrorMessage = _errorMessage;
Controls.Add(_req);
base.OnInit(e);
}
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
base.Render(writer);
_req.RenderControl(writer);
}
}
这里是后面的ASP.NET页面:
protected void SubmitClick(object sender, EventArgs e)
{
if(Page.IsValid)
{
// do something
}
}
这是ASPX代码:
<MyControl:RequiredTextBox runat="server" ErrorMessage="Name is required!" ID="txtName"></MyControl:RequiredTextBox>
<asp:Button ID="Btn_Submit" runat="server" Text="Submit" OnClick="SubmitClick" />
答案 1 :(得分:0)
验证者必须从BaseValidator继承。