我正在为 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);
}
}