3 つのテキスト ボックスを含むカスタム サーバー コントロールがあります。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 メソッドでテキスト ボックス コントロールを見つけることができません。私は何を間違っていますか?前もって感謝します。
注: ID の作成に UniqueID を使用すると、コントロールを複数回使用する場合の衝突を防ぐことができます。