2

私は Telerik の RadControls for ASP.NET AJAX を使用しています。

RadTextBox のすべての機能を含むカスタム コントロールを作成しようとしていますが、テキストに対して HTML エンコードを実行して、ユーザーが HTML インジェクションを実行したり、誤ってアプリケーション エラーを引き起こしたりしないようにします。PageLoad では、テキストはエンコードされた値に設定されるため、データを取得したり、データベースに保存したりする必要がある場合は、エンコードされた形式になります。次に、美学のために、テキスト ボックスのテキスト値をデコードされた値に設定します。

HTML エンコード プロセスがフィールドやデータベースの文字数制限を超えてテキスト ボックスの文字数を誤って拡張しないようにするカスタム バリデータを追加しようとしています (「<」や「>」などの文字は「<」に変換されます)。 ' および '>' (指定された文字制限を超える可能性があります)。

サーバー側の検証は正常に機能しますが、クライアント検証機能を使用して、無効な値が返された場合のポストバックを防止したいと考えています。クライアント検証関数が呼び出されない理由はありますか?

C#:

public partial class CustomTextBox : RadTextBox
{
    private CustomValidator cvTextBox;
    private string encodedText;
    private string decodedText;

    public CustomTextBox()
    {
        base.Init += Init;
        base.Load += Load;
        base.PreRender += PreRender;
    }

    public override string Text
    {
        get
        {
            return base.Text;
        }
        set
        {
            decodedText = HttpUtility.HtmlDecode(value);
            encodedText = decodedText == value ? HttpUtility.HtmlEncode(value) : value;
            base.Text = encodedText;
        }
    }

    protected new void Init(object sender, EventArgs e)
    {
        cvTextBox = new CustomValidator();
        cvTextBox.ID = this.ID + "_cvTextBox";
        cvTextBox.ControlToValidate = this.ID;
        cvTextBox.ClientIDMode = ClientIDMode.Static;
        cvTextBox.Display = ValidatorDisplay.Dynamic;
        cvTextBox.SetFocusOnError = false;
        cvTextBox.ErrorMessage = "<div class='validationMessage'>Field is too large after encoding. Remove any unnecessary '<', '>', or '&' characters.</div>";
        cvTextBox.ServerValidate += CustomTextBox_Validate;
        cvTextBox.EnableClientScript = true;
        cvTextBox.ClientValidationFunction = "testvalidate";
        cvTextBox.ValidateEmptyText = true;
        Controls.Add(cvTextBox);
    }

    protected new void Load(object sender, EventArgs e)
    {
        base.Text = encodedText;
    }

    protected new void PreRender(object sender, EventArgs e)
    {
        base.Text = decodedText;
    }

    protected override void Render(HtmlTextWriter writer)
    {
        base.Render(writer);
        cvTextBox.RenderControl(writer);
    }

    public void CustomTextBox_Validate(object source, ServerValidateEventArgs args)
    {
        CustomValidator cv = source as CustomValidator;
        args.IsValid = encodedText.Length < MaxLength;
    }
}

Javascript :

function testvalidate(source, args) {
    try {
        console.log("Will this message show?");
        args.IsValid = $find(source.controltovalidate).get_value().length < 50;
    } catch (error) {
        logError(error);
    }
}
4

1 に答える 1

0

イベントthis.IDでは無効だと思います。Initその値をデバッグし、生成された html コントロールの値と比較します。

メソッドを設定cvTextBox.ControlToValidate = this.ID;すると、Loadこの理論もテストされます。

于 2012-11-19T22:32:12.117 に答える