2

我有自定义服务器控件,其中包含三个文本框。我需要使用 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 是为了防止在多次使用我的控件时发生冲突。

4

2 回答 2

1

On_Init 太早了,因为那时还没有创建控件。

于 2013-02-12T15:55:19.750 回答
0

我发现问题出在哪里。我还不知道为什么,但是控件的 ID 属性不能包含“$”字符。在我的例子中,UniqueID 属性返回了类似“ ctl00$MainContent$ctl00 ”的字符串,所以控件的完整 ID 是“ Name-ctl00$MainContent$ctl00 ”。用其他符号替换“$”(以保持唯一性)解决了这个问题。顺便说一句,FindControl方法也开始起作用了。

_textBoxName.ID = "Name_" + UniqueID.Replace('$', '_')

另请注意,符号'-' 作为验证器的 ID 会导致 JS 中的语法错误(因为 ASP.NET 会尝试创建具有相同名称的 JS 对象),因此也不建议使用它。

于 2013-02-13T07:06:08.937 回答