【问题标题】:Setting a control's ID in code behind for use in a validation control在代码中设置控件的 ID 以用于验证控件
【发布时间】:2012-01-26 23:44:38
【问题描述】:

如何在服务器控件中使用验证控件?我遇到的问题是,默认情况下,如果我这样做:

private TextBox _textbox;
RequiredFieldValidator _validator;

protected override void OnInit(object sender, EventArgs e)
{
    _textbox= new TextBox {ID = "test"};
    _validator = new RequiredFieldValidator{ControlToValidate = _textbox.ID};
}

protected override void OnLoad(object sender, EventArgs e)
{
    this.Controls.Add(_textbox);
    this.Controls.Add(_validator);
}

然后它工作正常但是因为我在文本框后面的代码中设置了 ID 在实际生成的 HTML 中有一个 test 的 ID(而不是 ctl1_ctl2_test 或其他东西。)这意味着如果我在同一页然后我得到一个错误。如果我不设置 ID,则它为 null,验证器找不到控件。

任何帮助都会很棒,

谢谢,

【问题讨论】:

  • 为什么要在一个页面中使用同一个控件两次?两次使用相同的控件就像您同时在两个地方一样。不要做。量子纠缠尚未达到.Net。创建一个新控件。
  • 我不知道我是否理解你的问题。您是否尝试在页面中使用两次 RequiredFieldValidator(用于 2 个不同的控件)?
  • 您是否尝试在页面生命周期的后期设置 ControlToValidate 属性,例如:在加载或预渲染? @Sani:我假设这是一个自定义控件或用户控件,并且该控件在页面上多次使用。
  • 我已经尝试让它 OnPreRender 并且不起作用,但我面临另一个问题,即我有一个中继器,它的 ItemTemplate 中添加了各种控件。它需要使用 FindControl 来引用其 ItemDataBound 事件中的控件,但我再次无法为它们设置唯一 ID。
  • Sani:澄清一下,这只是代码重用。我说的是创建同一个控件的两个实例,而不是试图将同一个控件插入到控件层次结构中的两个位置(我认为 .NET 不可能做到这一点,它只会复制它。)

标签: c# asp.net servercontrols


【解决方案1】:

只需将INamingContainer 添加到您的服务器控件实现的接口列表中:

public class RequiredTextBox : Control, INamingContainer

现在子 TextBox 的 ID 将由服务器控件的 ID 限定,从而避免 ID 冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多