您会为.net项目推荐哪种验证框架?

时间:2012-01-05 21:38:58

标签: c# asp.net asp.net-mvc-3

要用于基于Web的mvc3 .net应用程序,您会推荐哪种验证框架?应用程序遵循域模型模式和域模型POCO在单独的类库中?

将要求的那种验证将是......非空,基于正则表达式等

2 个答案:

答案 0 :(得分:21)

我会选择FluentValidation,这是一个非常棒的开源项目

https://github.com/JeremySkinner/FluentValidation

对于基本和更复杂的验证同样有用

答案 1 :(得分:3)

如果您需要一个失败列表(而不是一次一个例外),那么我喜欢企业库验证块。

请参阅以下的powerpoint演示文稿: http://msdn.microsoft.com/en-us/library/ff650484.aspx

您可以针对POCO对象连接大多数基本验证。 可以在.config文件中设置很多预制规则。

你可以自己编写规则。

我的规则非常精细。他们一次执行1次验证。

作为一个简单的例子:我将有2个不同的规则来决定雇员是否可以雇用(基于出生日期)。 一条规则将确保指定员工的生日 第二条规则将确保当前日期减去出生日期大于18年。 (或者无论规则是什么)。

(现在让我们假设我有一堆规则)。 因此,在验证例程运行之后,我返回列表中所有(无效)情况的列表。例如,如果我正在验证员工,我会得到一份残疾人名单。

“未提供姓氏”

“没有提供FirstName”

“没有提供SSN”

而不是“一次一个”。 (“一次一个”这样做可能需要多次传递才能最终确定支票的有效性。)

下面是一些示例代码。假设有人试图买一本ISBN为“ABC123456”的书。

以下是一个自定义规则,用于检查该图书是否存在(例如,在您的产品数据库中)。我想你可以跟着走。它将与Book(.cs)poco对象相连。 (没有显示“接线”)。我只是想给你一个快速的例子,说明创建一个简单规则有多难(或不难)。

当找不到书籍时(使用isbn)....然后你会看到validationResults.AddResult方法。这就是你得到多个残疾人的方法。当您检查验证查询时,您将有权访问该集合。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;


namespace MyCompany.Applications.MyApplication.BusinessLogic.Validation.MyType1Validations
{
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
    public class BookExistsValidatorAttribute : ValidatorAttribute
    {
        protected override Validator DoCreateValidator(Type targetType)
        {
            return new BookExistsValidator("BookExistsValidatorTag");
        }
    }

    public class BookExistsValidator : Validator<string>
    {

        public BookExistsValidator(string tag) : base("BookExistsValidatorMessageTemplate", tag) { }

        protected override string DefaultMessageTemplate
        {
            get { throw new NotImplementedException(); }
        }

        protected override void DoValidate(string objectToValidate, object currentTarget, string key, ValidationResults validationResults)
        {

            bool bookExists = BookMatchExists(objectToValidate);

            if (!bookExists)
            {
                string msg = string.Format("The Book does not exist.  Your ISBN='{0}'", objectToValidate);
                validationResults.AddResult(new ValidationResult(msg, currentTarget, key, 10001, this)); /* 10001 is just some number I made up */

            }


        }

        private bool BookMatchExists(string isbn)
        {
            bool returnValue = false;

            IBookCollection coll = MyCompany.Applications.MyApplication.BusinessLogic.CachedControllers.BookController.FindAll(); /* Code not shown, but this would hit the db and return poco objects of books*/

            IBook foundBook = (from item in coll where item.ISBN.Equals(book, StringComparison.OrdinalIgnoreCase) select item).SingleOrDefault();

            if (null != foundBook)
            {
                returnValue = true;
            }
            return returnValue;
        }



    }
}