65.9K
CodeProject 正在变化。 阅读更多。
Home

自定义验证摘要

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (9投票s)

2010年11月22日

CPOL

3分钟阅读

viewsIcon

55167

downloadIcon

391

支持多验证组的自定义验证摘要

引言

一个月前,我正在进行一个 ASP.NET 项目,我仍然在做这个项目,我遇到了一个问题,我想要一个集中的验证摘要和多重验证组。 当然,我毫不犹豫地添加了一个集中的验证摘要,并开始进行我的验证……但不幸的是,我没有那么幸运可以成功!!!

问题!!!

一开始,我以为我做错了什么,我的场景比基本更进一步,并且非常希望能出现,两组控件,每个控件都有一个验证组,以及一个验证摘要。 我在服务器端使用 Page.Validate(ValidationGroupName) 对每个组进行验证,如下所示

Page.Validate("ValidationGroup1");
Page.Validate("ValidationGroup2");
if (Page.IsValid)
{
    //Do Something when validation successes 
}
else
{
    //Do something else when validation fails
} 

有趣的是,如果我想显示来自 ValidationGroup1ValidationGroup2 的验证消息,我必须有两个验证摘要,第一个设置为使用 ValidationGroup1,另一个设置为使用 ValidationGroup2。 *换句话说,对于您在该页面中拥有的或即将出现的每个验证组,您必须有 n 个验证摘要*。

现在,这让我足够生气,想要拥有自己的验证摘要。

调查

为了解决这个问题,我从互联网开始,搜索一篇文章、帖子或博客,其中包含针对这种多年来一直在发生的基本场景的解决方案! 令人难以置信的是,我找不到一个像样的解决方案! 我是认真的! 我发现的最好的东西是涉及在运行时创建重复的验证器并将它们添加到宿主页面。 我知道这听起来很疯狂,但说真的,那是最好的解决方案!!

所以我开始调查 ASP.NET 验证摘要控件本身,我偷看了它的源代码,以弄清楚为什么它不支持多个验证组,我发现了以下内容

internal string[] GetErrorMessages(out bool inError)
{
    string[] strArray = null;
    inError = false;
    int num = 0;
    ValidatorCollection validators = this.Page.GetValidators(this.ValidationGroup);
    for (int i = 0; i < validators.Count; i++)
    {
        IValidator validator = validators[i];
        if (!validator.IsValid)
        {
            inError = true;
            if (validator.ErrorMessage.Length != 0)
            {
                num++;
            }
        }
    }
    if (num != 0)
    {
        strArray = new string[num];
        int index = 0;
        for (int j = 0; j < validators.Count; j++)
        {
            IValidator validator2 = validators[j];
            if ((!validator2.IsValid && (validator2.ErrorMessage != null)) && 
		(validator2.ErrorMessage.Length != 0))
            {
                strArray[index] = string.Copy(validator2.ErrorMessage);
                index++;
            }
        }
    }
    return strArray;
}

请注意斜体加粗的代码行; 验证摘要使用其宿主页面来获取与验证摘要具有相同验证组的验证器!! 因此,它不可能支持多个验证组! 当然,GetValidators(ValidationGroupName) 方法不会将 nullempty 验证组视为特殊情况,而是将其视为指定了验证组的另一种情况,因此只会检索一个验证组的验证器。

解决方案

为了解决这个问题,我首先想到的是拥有一个自定义控件,其行为与当前 ASP.NET 验证摘要完全相同,并具有在宿主页面上支持任何验证组的额外功能。

首先,我只是添加了一个新的枚举 ValidationGroupMode

/// <summary>
/// The way the validation summary shall behave toward validation groups.
/// </summary>
public enum ValidationGroupMode
{
    /// <summary>
    /// Only one validation group will be registered to the validation summary.
    /// (This will make this validation summary act just like the 
    /// ASP.NET validation summary.)
    /// </summary>
    SingleValidationGroup = 0,
    /// <summary>
    /// All validation groups will be registered in the validation summary.
    /// </summary>
    AllValidationGroups = 1
} 

其次,我调整了 GetErrorMessages 方法,使其如下所示

internal string[] GetErrorMessages(out bool inError)
    {
        string[] strArray = null;
        inError = false;
        int num = 0;
        ValidatorCollection validators
            = this.ValidationGroupMode == ValidationGroupMode.AllValidationGroups ? 
		this.Page.Validators : this.Page.GetValidators(this.ValidationGroup);
        for (int i = 0; i < validators.Count; i++)
        {
            IValidator validator = validators[i];
            if (!validator.IsValid)
            {
                inError = true;
                if (validator.ErrorMessage.Length != 0)
                {
                    num++;
                }
            }
        }
        if (num != 0)
        {
            strArray = new string[num];
            int index = 0;
            for (int j = 0; j < validators.Count; j++)
            {
                IValidator validator2 = validators[j];
                if ((!validator2.IsValid && (validator2.ErrorMessage != null)) 
			&& (validator2.ErrorMessage.Length != 0))
                {
                    strArray[index] = string.Copy(validator2.ErrorMessage);
                    index++;
                }
            }
        }
        return strArray;
    }

简单地说,如果我想让所有验证组共享同一个验证摘要,我使用 this.Page.Validators 获取页面上的所有验证器。

结束语

我希望这篇文章有用,并且我附上了自定义验证摘要的代码。 我确保它与 Framework 2.0 及以上版本兼容。

历史

  • V 1.0 创建了文章
© . All rights reserved.