自定义的ValidationSummary控件
一. 目的:
实现一个带linked的ValidationSummary控件
二. 实现:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/// <summary>
/// 验证控件
/// </summary>
[ToolboxData("<{0}:ValidationSummaryControl runat=server></{0}:ValidationSummaryControl>")]
public class ValidationSummaryControl : ValidationSummary
{
#region 变量
/// <summary>
/// 设置控件焦点的脚本
/// </summary>
private static readonly string strJs = @"function setFocus(control)
{
var controlToValidate = document.getElementById(control);
controlToValidate.focus();
} ";
#endregion
#region 事件
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
//注册脚本
RegisterScript();
}
protected override void Render(HtmlTextWriter writer)
{
MakeClickableErrorMessage();
base.Render(writer);
}
#endregion
#region 私有方法
/// <summary>
/// 让错误信息能够定位相应控件
/// </summary>
private void MakeClickableErrorMessage()
{
foreach (BaseValidator validator in this.Page.Validators)
{
if (validator.ControlToValidate == string.Empty || validator.ErrorMessage == string.Empty)
{
continue;
}
//获取需验证的控件
Control controlToValidate = validator.Parent.FindControl(validator.ControlToValidate);
if (null != controlToValidate)
{
string clientID = controlToValidate.ClientID;
string script = string.Format("<a href= \"javascript:setFocus('{0}');\">{1}</a>", clientID, validator.ErrorMessage);
//给错误信息添加linked
validator.ErrorMessage = script;
validator.Display = ValidatorDisplay.None;
}
}
}
/// <summary>
/// 注册脚本
/// </summary>
private void RegisterScript()
{
if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "__ValidationSummaryControl"))
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "__ValidationSummaryControl", strJs, true);
}
}
#endregion
}
一个带有linked的ValidationSummary控件就写好了。
三. 说明:
其中MakeClickableErrorMessage方法是可以放在OnPreRender方法中的,但是与我后来做得一个带有验证控件的TextBox有冲突,所以把MakeClickableErrorMessage方法写到了Render方法中去了。