2

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 を使用すると、コントロールを複数回使用する場合の衝突を防ぐことができます。

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 に答える