正在使用RequiredFieldValidator验证服务器控件中的文本框

本文关键字:文本 服务器控件 验证 RequiredFieldValidator | 更新日期: 2023-09-27 17:58:59

我有自定义的服务器控件,它包含三个文本框。我需要使用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(字符串id)方法在OnInit方法中找不到我的文本框控件。我做错了什么?提前谢谢。

注意:使用UniqueID创建ID是为了防止多次使用我的控件时发生冲突。

正在使用RequiredFieldValidator验证服务器控件中的文本框

On_Init为时过早,因为此时还没有创建控件。

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

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

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