标签: fluentvalidation

C# .net Core Fluentvalidation手动验证获取验证器类实例

我试图获取验证器类实例,而不是在我的方法中手动启动。

我正在使用 Asp .net core webapi 2,我在启动类中注册我的验证器

services.AddMvc().AddFluentValidation().
Run Code Online (Sandbox Code Playgroud)

在我的一种操作方法中,我必须验证规则集。所以我在本地创建我的验证器类

var validator = new MyClassValidator()
var result = validator.Validate(obj,ruleSet: "RulesetName");
Run Code Online (Sandbox Code Playgroud)

我试图避免这种说法var validator = new MyClassValidator()。我想使用 IOC 并获取一个实例。有什么帮助吗?

c# validation fluentvalidation asp.net-web-api asp.net-core

3
推荐指数
1
解决办法
6117
查看次数

Fluent 验证器检查数据库中是否存在具有 ID 的实体

我正在尝试编写一个自定义验证器,它将使用 OrmLite 检查数据库中是否存在实体。问题是 IRuleBuilder 的类型参数无法再从使用中推断出来。

我必须像这样编写方法调用:

RuleFor(r => r.Id).Exists<DtoName, int, EntityName>()
Run Code Online (Sandbox Code Playgroud)

但我想这样写:

Rulefor(r => r.Id).Exists<EntityName>()
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为 IRuleBuilder 有两个类型参数,并且该方法是扩展方法。是否有一种聪明、流畅的方法来设计这个并使函数调用最好像第二个版本一样?

这是我的扩展方法和验证器的代码:

    public static class AbstractValidatorExtensions
    {
        public static IRuleBuilderOptions<T, TProperty> Exists<T, TProperty, U>(this IRuleBuilder<T, TProperty> ruleBuilder)
        {
            return ruleBuilder.SetValidator(new EntityExistsValidator<U>());
        }                
    }

    public class EntityExistsValidator<T> : PropertyValidator
    {
        public EntityExistsValidator() : base("Entity does not exist") {}

        protected override bool IsValid(PropertyValidatorContext context)
        {
            return HostContext.Resolve<Repository>()
                .Exists<T>((int)context.PropertyValue);
        }
    }
Run Code Online (Sandbox Code Playgroud)

fluentvalidation servicestack

3
推荐指数
1
解决办法
1万
查看次数

FluentValidation 中间件在 .NETCore WebAPI 中是否足够,或者我应该再次在服务层中进行验证?

我有一个非常简单的三层ASP.NET Core WebAPI应用程序:

  1. - 包含EntitiesData interfaces和对象(这是唯一的输入和输出对象)ServicesDTO因此,“域的接口”是接受输入 DTO 并返回输出 DTO 的服务。
  2. 基础设施- Data interfaces(数据存储库)和 CodeFirst 迁移的实施。
  3. WebAPI - 标准 ASP.NET Core 3.1 Web API 项目。

WebAPI 项目在控制器中返回“输出”DTO。对于接受负载的端点,使用“输入”DTO。控制器与域中的服务非常相似。控制器向世界公开域服务(显然是域的接口)。

但接下来是验证......我熟悉 FluentValidation 和 ASP.NET Core 管道 - 它是一个很棒的中间件:

        services.AddControllers()
            .AddFluentValidation(opt =>
            {
                opt.RegisterValidatorsFromAssemblyContaining(typeof(PersonInputValidator));
            });
Run Code Online (Sandbox Code Playgroud)

我对每个“输入”DTO 实施验证,这效果很好,但是......我不确定这是否足够。如果您参加任何服务课程,它几乎都没有经过验证。它是 .NET Core 中间件,从技术上验证控制器的输入。

我应该再次在服务中“双重验证”吗?如果是这样,是否有一种顺利的方法来重用我已有的验证器?

c# validation fluentvalidation .net-core asp.net-core-webapi

3
推荐指数
1
解决办法
9204
查看次数

FluentValidation:在子集合规则中使用父属性值

我有这个验证器:

 public class InputValidator : AbstractValidator<InputData>
{
    public InputValidator()
    { 
        RuleFor(inputData => inputData.Ucl).GreaterThan(0).....;

        RuleForEach(inputData => inputData.Loads).ChildRules(inputData => {            
              inputData.RuleFor(load => load.Position).GreaterThan(0).....); 
            });
... etc
Run Code Online (Sandbox Code Playgroud)

但是:位置(在每个负载中)也必须小于 Ucl(在输入数据中)。如何为这种关系(父参数与子参数)制定规则?

c# fluentvalidation

3
推荐指数
1
解决办法
5517
查看次数

使用一条消息验证多个属性

我正在尝试验证一个具有三个必需属性的类。
如果其中一个或多个为空,则应触发一条验证消息。
在流畅的验证器中是否有一种惯用的方式来描述这一点?

我正在查看相关规则,但文档页面的底部建议不要使用它们。
此外,我仍然想验证所有三个属性。我只是不想收到重复的消息。
我注意到RuleSets,但这些似乎有不同的目的。

或者,我可以专门为这三个选项创建一个验证器,但没有消息,然后将新的验证器链接到原始验证器中。然后我想我可以给那个人一条信息。
但对于一个围绕可读性构建的系统来说,这是一个繁重的仪式。

因此,寻找一种可读的方式来表达对三个字段的验证,并用一条消息作为结果。

fluentvalidation

3
推荐指数
1
解决办法
7523
查看次数

如何使用 FluentValidation 创建强密码?

我正在使用 FluentValidation 设计用户注册屏幕。

我想建立一个控制机制,提供有关所有步骤的信息,如下所示。

我尝试过的代码;

RuleFor(p => p.Password).Matches(@"[A-Z]+").WithMessage("Your password must contain at least one uppercase letter.");
        RuleFor(p => p.Password).Matches(@"[a-z]+").WithMessage("Your password must contain at least one lowercase letter.");
        RuleFor(p => p.Password).Matches(@"[0-9]+").WithMessage("Your password must contain at least one number.");
        RuleFor(x => x.Password).Matches(@"[\!\?\*\.]*$").WithMessage("Your password must contain at least one (!? *.).");
Run Code Online (Sandbox Code Playgroud)

但我无法达到我想要的结果。我还查看了 FluentValidation 文档,但没有看到任何有用的示例。

如果您有帮助,我会很高兴。

谢谢。

regex fluentvalidation asp.net-mvc-4 asp.net-core asp.net-core-3.1

3
推荐指数
1
解决办法
4732
查看次数

C# 中具有流畅验证的正则表达式 - 如何不允许密码中出现空格和某些特殊字符?

这是迄今为止我的 C# 应用程序中对密码的流畅验证

\n
RuleFor(request => request.Password)\n    .NotEmpty()\n    .MinimumLength(8)\n    .Matches("[A-Z]+").WithMessage("'{PropertyName}' must contain one or more capital letters.")\n    .Matches("[a-z]+").WithMessage("'{PropertyName}' must contain one or more lowercase letters.")\n    .Matches(@"(\\d)+").WithMessage("'{PropertyName}' must contain one or more digits.")\n    .Matches(@"[""!@$%^&*(){}:;<>,.?/+\\-_=|'[\\]~\\\\]").WithMessage("'{ PropertyName}' must contain one or more special characters.")\n    .Matches("(?!.*[\xc2\xa3# \xe2\x80\x9c\xe2\x80\x9d])").WithMessage("'{PropertyName}' must not contain the following characters \xc2\xa3 # \xe2\x80\x9c\xe2\x80\x9d or spaces.")\n    .Must(pass => !blacklistedWords.Any(word => pass.IndexOf(word, StringComparison.OrdinalIgnoreCase) >= 0))\n        .WithMessage("'{PropertyName}' contains a word that is not allowed.");\n
Run Code Online (Sandbox Code Playgroud)\n

以下部分目前不起作用

\n
.Matches("(?!.*[\xc2\xa3# \xe2\x80\x9c\xe2\x80\x9d])").WithMessage("'{PropertyName}' must not contain the following …
Run Code Online (Sandbox Code Playgroud)

c# regex validation fluentvalidation

3
推荐指数
1
解决办法
8668
查看次数

ServiceStack中的Fluent验证没有错误消息

我刚刚开始熟悉ServiceStack并且已经开始使用FluentValidation了.我已经按照介绍并创建了一个小型Hello应用程序.

我的问题是,当我尝试验证请求DTO时,没有返回错误消息来描述验证失败的方法,只有空白的Json对象{}.

我自己,我认为验证是自动连接到DTO所以我不需要编写任何额外的代码.

答案可能是公然但我看不到它.任何帮助将不胜感激.我的代码如下:

namespace SampleHello2
{
    [Route("/hello")]
    [Route("/hello/{Name}")]
    public class Hello
    {
        public string Name { get; set; }
    }

    public class HelloResponse
    {
        public string Result { get; set; }
    }


    public class HelloService : Service
    {
        public object Any(Hello request)
        {
            return new HelloResponse { Result = "Hello, " + request.Name };
        }
    }

    public class HelloValidator : AbstractValidator<Hello>
    {
        public HelloValidator()
        {
            //Validation rules for all requests
            RuleFor(r => r.Name).NotNull().NotEmpty().Equal("Ian").WithErrorCode("ShouldNotBeEmpty"); …
Run Code Online (Sandbox Code Playgroud)

c# fluentvalidation servicestack

2
推荐指数
1
解决办法
1721
查看次数

Servicestack - 操作顺序流畅的验证和请求过滤器

我们有一些请求过滤器,也使用验证功能.

[AttributeUsage(AttributeTargets.Method, Inherited = true)]
public class MyFilterAttribute : Attribute, IHasRequestFilter
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

在AppHost中:

    public override void Configure(Container container)
    {
        ....
        Plugins.Add(new ValidationFeature());
        ....
    }
Run Code Online (Sandbox Code Playgroud)

我需要在请求过滤器之后运行流畅的验证,因为一些过滤器会将数据添加到dto然后进行验证.我已经看到了操作顺序但是没有说明验证的位置......至少我没有看到.

任何帮助,将不胜感激.

c# fluentvalidation servicestack

2
推荐指数
1
解决办法
782
查看次数

FluentValidation ModelState.IsValid始终为true

好吧我的问题是来自fluentValidation的modelvalidator在我的项目中不起作用,并且无论验证状态如何,ModelState.IsValid始终为true,我提前使用asp.net mvc 4,.net 4.5,thx.

Global.asax中

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();
        FluentValidationModelValidatorProvider.Configure();
    }
Run Code Online (Sandbox Code Playgroud)

LoginViewModel

using FluentValidation.Attributes;

namespace ViewModel.Cuentas
{

 [Validator(typeof(LoginViewModel))]
 public class LoginViewModel
 {
    public string UserName { get; set; }
    public string Password { get; set; }
 }
}
Run Code Online (Sandbox Code Playgroud)

LoginViewModelValidator

using FluentValidation;
using FluentValidation.Results;
namespace ViewModel.Cuentas.Validadores
{
    public class LoginViewModelValidator : AbstractValidator<LoginViewModel>
    {
        public LoginViewModelValidator()
        {
        RuleFor(x => x.UserName).NotEmpty().WithMessage("El Campo Usuario es Necesario");
        RuleFor(x => x.Password).NotEmpty().WithMessage("El Campo Usuario es Necesario");
        }
   }
}
Run Code Online (Sandbox Code Playgroud)

和我的帐户管理员

   [HttpPost] …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc fluentvalidation

2
推荐指数
1
解决办法
4335
查看次数