用于WinForms、MVC4和WCF API的.NET表单验证库

用于WinForms、MVC4和WCF API的.NET表单验证库,.net,winforms,asp.net-mvc-4,validation,.net,Winforms,Asp.net Mvc 4,Validation,我有一个项目,我们实施了一系列复杂的法律形式,用于与法定机构进行电子交易 我们的产品可以作为桌面WinForms应用程序,通过MVC4网站和REST API访问 目前,我们在WinForms的用户事件中内置了自定义验证规则,与MVC4中基于jQuery的验证基本相同 我正在考虑重新编写验证代码,以便为RESTAPI提供请求验证 是否有一个库或包我可以用来创建一个单一的DLL,将验证提交的数据,无论输入源?最好将所有表单验证逻辑都保存在一个地方,然后根据需要进行部署。我们不仅仅验证表单字段;我们还

我有一个项目,我们实施了一系列复杂的法律形式,用于与法定机构进行电子交易

我们的产品可以作为桌面WinForms应用程序,通过MVC4网站和REST API访问

目前,我们在WinForms的用户事件中内置了自定义验证规则,与MVC4中基于jQuery的验证基本相同

我正在考虑重新编写验证代码,以便为RESTAPI提供请求验证


是否有一个库或包我可以用来创建一个单一的DLL,将验证提交的数据,无论输入源?最好将所有表单验证逻辑都保存在一个地方,然后根据需要进行部署。我们不仅仅验证表单字段;我们还必须针对后端数据库进行验证。法定机构的规范长达数千页。

我有点了解您需要什么:

以下是我们的方法,可在您的库设计中派上用场: 假设您的项目遵循传统的分层体系结构,您可以将验证放在

使用什么图书馆? 我们使用,以便您只需在应用程序中安装即可添加对项目的引用:

Install-Package FluentValidation.MVC5
但是如何使用它呢

定义一个类似于以下实现的抽象BaseValidator类,并根据您的需要进行调整:

public abstract class BaseValidator<T> : AbstractValidator<T> where T : class
{
    public bool IsValid(T entity)
    {
        return Validate(entity).IsValid;
    }

    private bool IsValid(T entity, out IList<ValidationFailure> errors)
    {
        var result = Validate(entity);
        errors = result.Errors;

        return Validate(entity).IsValid;
    }

    public bool IsValidOrException(T entity)
    {
        IList<ValidationFailure> errors;

        if (!IsValid(entity, out errors))
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine(string.Format("Entity of type {0} is not valid:", typeof(T).Name));

            var failures = new List<FluentValidation.Results.ValidationFailure>(errors.Count);

            foreach (var errorMessage in errors)
            {
                sb.AppendLine(errorMessage.ErrorMessage);

                FluentValidation.Results.ValidationFailure failure = new FluentValidation.Results.ValidationFailure(errorMessage.PropertyName, errorMessage.ErrorMessage);

                failures.Add(failure);
            }

            throw new ValidationException(failures);
        }

        return true;
    }

    public new ValidateResult Validate(T entity)
    {
        ValidationResult validationResult = base.Validate(entity);
        IList<ValidationFailure> failures = new List<ValidationFailure>();

        for (var i = 0; i < validationResult.Errors.Count; i++)
        {
            var error = validationResult.Errors[i];
            failures.Add(new ValidationFailure(error.ErrorMessage, error.PropertyName));
        }

        ValidateResult result = new ValidateResult(validationResult.IsValid, failures);
        return result;
    }
}

上述方法非常通用且可重复使用,可以作为域层的一部分保存在单独的创建DLL中。

您的问题在于,您询问的是服务器端验证取代客户端验证。没有通用的客户端验证库。MVC4有服务器端验证:但我认为DataAnnotations对于我们的目的来说不够复杂
    internal class CurrencyValidator : BaseValidator<Currency>
{
    public CurrencyValidator()
    {
        RuleFor(x => x.IsoThreeLetter).Length(3, 3).WithMessage("Currency requires IsoCode of 3 letters");
        RuleFor(x => x.Symbol).NotNull().NotEmpty().WithMessage("Currency requires a symbol");
        RuleFor(x => x.HtmlSymbol).NotNull().NotEmpty().WithMessage("Currency requires a html symbol");
    }
}
    public void AddCurrency(Currency currency)
    {
        if (new CurrencyValidator().IsValidOrException(currency))
        {
            _dto.Currencies.Add(currency);
        }
    }