我有自定义服务器控件,其中包含三个文本框。我需要使用 ASP.NET 字段验证器来验证其内容。
我将RequiredFieldValidator 的“ ControlToValidate ”属性设置为我的文本框的ID 属性,但似乎验证器无法找到此文本框。这是我正在尝试做的简化代码(省略当前未使用的字段和属性):
[DefaultProperty("Text")]
[ToolboxData("<{0}:ServerControl runat=server></{0}:ServerControl>")]
public class CommentServerControl : WebControl, IPostBackDataHandler
{
private TextBox _textBoxName;
private RequiredFieldValidator _requiredName;
protected override void OnInit(EventArgs e)
{
var idName = "Name-" + UniqueID;
_textBoxName = new TextBox();
_textBoxName.ID = idName;
_textBoxName.ClientIDMode = System.Web.UI.ClientIDMode.Static;
_textBoxName.ValidationGroup = ValidationGroup; // is set up via mark up
Controls.Add(_textBoxName);
_requiredName = new RequiredFieldValidator();
_requiredName.ID = "RequiredName-" + UniqueID;
_requiredName.ValidationGroup = ValidationGroup;
_requiredName.ErrorMessage = RequiredMessage; // is set up via mark up
_requiredName.ControlToValidate = _textBoxName.ID;
Controls.Add(_requiredName);
}
public string ValidationGroup
{
get
{
var s = (string)ViewState["ValidationGroup"];
return (s ?? string.Empty);
}
set
{
ViewState["ValidationGroup"] = value;
}
}
public string RequiredMessage
{
get
{
var s = (string)ViewState["RequiredMessage"];
return (s ?? string.Empty);
}
set
{
ViewState["RequiredMessage"] = value;
}
}
}
运行此代码时,我收到错误消息“无法找到由“RequiredName”的“ControlToValidate”属性引用的控件 ID“Name-ctl00$MainContent$ctl00”。'
我已经读过这可能会发生,因为控件具有不同的 NamingContainer,但在这种情况下,对 NamingContainer 的引用是相同的。但是,FindControl(string id)方法在 OnInit 方法中找不到我的文本框控件。我究竟做错了什么?提前致谢。
注意:使用 UniqueID 创建 ID 是为了防止在多次使用我的控件时发生冲突。