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