【问题标题】:Validating textbox in Server Control using RequiredFieldValidator使用 RequiredFieldValidator 验证服务器控件中的文本框
【发布时间】:2013-01-27 23:33:14
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net requiredfieldvalidator servercontrols


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 对什么来说太早了?)我手动初始化并将控件添加到集合中,然后可以找到它们,但不使用 FindControl 方法(不幸的是,这意味着字段验证器不能做同样的事情)。但是,我将控件添加到 OnLoad 处理程序 - 错误仍然存​​在。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 2023-04-07
      • 2012-09-11
      • 2012-01-08
      • 2010-12-27
      • 1970-01-01
      相关资源
      最近更新 更多