2

我正在为 ASP.NET AJAX 使用 Telerik 的 RadControls。

我正在尝试创建一个包含 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 回答