问题描述
我有一个看起来这样的类:
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错误可以阻止验证器从射击中,因此服务器侧验证应该启动......对吗?右?
所以页面.Isvalid属性始终返回true(我甚至尝试过明确调用page.validate()之前).
在一些挖掘之后,我发现验证器Init方法应该将验证器添加到页面,但由于我建立它的方式,我认为这不会发生这种情况.因此,客户端验证工作,但服务器侧验证没有.我已经尝试过:
protected override OnInit() { base.OnInit(); Page.Validators.Add(_validator); // <-- validator is null here }但是当然,验证器在此处为空(有时它不需要,所以不应添加)......但是oninit()真的很早就为我制作这些决定(所需的财产不需要例如,从ViewState加载).
想法?
推荐答案
crectechildcontrols基本上用于具有姓氏的控件.必需的rieldValidator就像是一个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" />
其他推荐答案
验证器必须从basevalidator继承.