Как правильно настроить валидацию пароля в Blazor FluentValidation?

Ссылка скопирована
1 ответ

Есть класс

public class LoginModel {     [Required]     [JsonPropertyName("Email")]     public string Email { get; set; }     [Required]     [JsonPropertyName("Password")]     public string Password { get; set; } }

public class LoginModel { [Required] [JsonPropertyName("Email")] public string Email { get; set; } [Required] [JsonPropertyName("Password")] public string Password { get; set; } }

Класс валидации под вышеуказанную модель

public class LoginModelValidation : AbstractValidator<LoginModel> {     public LoginModelValidation()     {         RuleFor(p => p.Email).NotEmpty().WithMessage("You must enter a email address");         RuleFor(x => x.Email).EmailAddress().WithMessage("Please enter valid an email");         RuleFor(_ => _.Password).NotEmpty().WithMessage("Your password cannot be empty");         RuleFor(_ => _.Password).MinimumLength(6).WithMessage("Your password length must be at least 6.");         RuleFor(_ => _.Password).MaximumLength(16).WithMessage("Your password length must not exceed 16.");         RuleFor(_ => _.Password).Matches(@"[A-Z]+").WithMessage("Your password must contain at least one uppercase letter.");         RuleFor(_ => _.Password).Matches(@"[a-z]+").WithMessage("Your password must contain at least one lowercase letter.");         RuleFor(_ => _.Password).Matches(@"[0-9]+").WithMessage("Your password must contain at least one number.");         RuleFor(_ => _.Password).Matches(@"[@!?*.]+").WithMessage("Your password must contain at least one (@!? *.).");      } }

public class LoginModelValidation : AbstractValidator<LoginModel> { public LoginModelValidation() { RuleFor(p => p.Email).NotEmpty().WithMessage("You must enter a email address"); RuleFor(x => x.Email).EmailAddress().WithMessage("Please enter valid an email"); RuleFor(_ => _.Password).NotEmpty().WithMessage("Your password cannot be empty"); RuleFor(_ => _.Password).MinimumLength(6).WithMessage("Your password length must be at least 6."); RuleFor(_ => _.Password).MaximumLength(16).WithMessage("Your password length must not exceed 16."); RuleFor(_ => _.Password).Matches(@"[A-Z]+").WithMessage("Your password must contain at least one uppercase letter."); RuleFor(_ => _.Password).Matches(@"[a-z]+").WithMessage("Your password must contain at least one lowercase letter."); RuleFor(_ => _.Password).Matches(@"[0-9]+").WithMessage("Your password must contain at least one number."); RuleFor(_ => _.Password).Matches(@"[@!?*.]+").WithMessage("Your password must contain at least one (@!? *.)."); } }

Регистрация валидации

builder.Services.AddControllers().AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<LoginModelValidation>());

builder.Services.AddControllers().AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<LoginModelValidation>());

.razor

<EditForm Model="@loginModel" OnValidSubmit="SubmitForm" class="text-center">     <FluentValidationValidator/>     <label for="Email" class="float-start">Email</label>     <InputText class="form-control border-0 text-white" type="email" name="Email" placeholder="Email" @bind-Value="loginModel.Email" />     <ValidationMessage For="@(() => loginModel.Email)" />     <label for="Password" class="float-start mt-2">Password</label>     <InputText class="form-control border-0 text-white" type="password" name="Password" placeholder="Password" @bind-Value="loginModel.Password" />     <ValidationMessage For="@(() => loginModel.Password)" />     <div class="row">         <div class="forgot">             <a href="" class=" float-end">Forgot Password?</a>         </div>     </div>     <div class="row">     <div class="col">         <button class="btn btn-primary border-0 text-center" type="submit" name="submit">Sign In</button>         </div>     </div>  </EditForm>

<EditForm Model="@loginModel" OnValidSubmit="SubmitForm" class="text-center"> <FluentValidationValidator/> <label for="Email" class="float-start">Email</label> <InputText class="form-control border-0 text-white" type="email" name="Email" placeholder="Email" @bind-Value="loginModel.Email" /> <ValidationMessage For="@(() => loginModel.Email)" /> <label for="Password" class="float-start mt-2">Password</label> <InputText class="form-control border-0 text-white" type="password" name="Password" placeholder="Password" @bind-Value="loginModel.Password" /> <ValidationMessage For="@(() => loginModel.Password)" /> <div class="row"> <div class="forgot"> <a href="" class=" float-end">Forgot Password?</a> </div> </div> <div class="row"> <div class="col"> <button class="btn btn-primary border-0 text-center" type="submit" name="submit">Sign In</button> </div> </div> </EditForm>

И получается так что если у Input тип "password", то валидация вообще не работает, всегда не проходит. Но если я в input поставлю тип текст, то все проверки валидации работают. Может я не так что делаю? Может это баг библиотеки FluentValidation? С одним типом input работает, с другим не работает.

Как правильно настроить валидацию пароля в Blazor FluentValidation?

Дополнительно:

Ответы:

Вы используете

fv.RegisterValidatorsFromAssemblyContaining<LoginModelValidation>())

fv.RegisterValidatorsFromAssemblyContaining<LoginModelValidation>())

Это автоматическая регистрация сервисов валидаци, но она не работает на .net 8 (И, вроде бы на .net 7, но жто не точно). По этому, если вы используете указанную версию .net, вас все валидаторы нужно регистрировать вручную

  • Может я не так написал. Но валидация со всеми типами input Работает корректно кроме type="password". Если я в этом же инпуте поменяю тип на text, то валидация отрабатывает
  • Как правильно настроить валидацию пароля в Blazor FluentValidation?

  • я думал может на гитхабе майкам тикет создать. Выглядит как косяк с их стороны
  • dotnetcsharp, так а где у вас проверка вообще валидации?
  • Nik Faraday,
    public class LoginModelValidation : AbstractValidator<LoginModel> {     public LoginModelValidation()     {         RuleFor(p => p.Email).NotEmpty().WithMessage("You must enter a email address");         RuleFor(x => x.Email).EmailAddress().WithMessage("Please enter valid an email");         RuleFor(_ => _.Password).NotEmpty().WithMessage("Your password cannot be empty");         RuleFor(_ => _.Password).MinimumLength(6).WithMessage("Your password length must be at least 6.");         RuleFor(_ => _.Password).MaximumLength(16).WithMessage("Your password length must not exceed 16.");         RuleFor(_ => _.Password).Matches(@"[A-Z]+").WithMessage("Your password must contain at least one uppercase letter.");         RuleFor(_ => _.Password).Matches(@"[a-z]+").WithMessage("Your password must contain at least one lowercase letter.");         RuleFor(_ => _.Password).Matches(@"[0-9]+").WithMessage("Your password must contain at least one number.");         RuleFor(_ => _.Password).Matches(@"[@!?*.]+").WithMessage("Your password must contain at least one (@!? *.).");      } }

    public class LoginModelValidation : AbstractValidator<LoginModel> { public LoginModelValidation() { RuleFor(p => p.Email).NotEmpty().WithMessage("You must enter a email address"); RuleFor(x => x.Email).EmailAddress().WithMessage("Please enter valid an email"); RuleFor(_ => _.Password).NotEmpty().WithMessage("Your password cannot be empty"); RuleFor(_ => _.Password).MinimumLength(6).WithMessage("Your password length must be at least 6."); RuleFor(_ => _.Password).MaximumLength(16).WithMessage("Your password length must not exceed 16."); RuleFor(_ => _.Password).Matches(@"[A-Z]+").WithMessage("Your password must contain at least one uppercase letter."); RuleFor(_ => _.Password).Matches(@"[a-z]+").WithMessage("Your password must contain at least one lowercase letter."); RuleFor(_ => _.Password).Matches(@"[0-9]+").WithMessage("Your password must contain at least one number."); RuleFor(_ => _.Password).Matches(@"[@!?*.]+").WithMessage("Your password must contain at least one (@!? *.)."); } }

  • dotnetcsharp, у вас, скорее всего, проблема не с валидацией, а с отправкой данных. Почему? Это может быть связанно с различными типами полей (text, password). На уровне контроллеров у вас вообще не стоит валидация, по этому рекомендую прочитать за ModelState.

    это баг библиотеки FluentValidation

    Нет, но так нужно смотреть что, где и как работает и отправляется

  • Nik Faraday, 2 дня с этим разбирался, так бесполезно время я еще не тратил что бы делать костыли. Но теперь работает, вот что изменил
    <InputText class="form-control border-0 text-white" type="password" name="Password" placeholder="Password" @oninput="@((ui) => {Model.Password = ui.Value.ToString();})" @bind-Value="Model.Password" />

    <InputText class="form-control border-0 text-white" type="password" name="Password" placeholder="Password" @oninput="@((ui) => {Model.Password = ui.Value.ToString();})" @bind-Value="Model.Password" />

    А конкретно добавил

    @oninput="@((ui) => {Model.Password = ui.Value.ToString();})"

    @oninput="@((ui) => {Model.Password = ui.Value.ToString();})"

  • Nik Faraday, Пока ковырялся в этом вопросе обнаружил такую штуку. Разные браузеры по разному работают с input password. К примеру, Edge все отлично работает в моем проекте из коробки. А для хрома пришлось сделать костыль выше
  • dotnetcsharp,

    Разные браузеры по разному работают с input password

    Да, такое так же может быть.

    Ещё можете попробовать использовать вместо bind-Value просто bind

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Анна SEO Ответ

Для настройки валидации пароля в Blazor с использованием FluentValidation, вам необходимо выполнить несколько шагов.

1. Установите пакет FluentValidation для Blazor, выполнив команду в консоли NuGet Package Manager:

Install-Package FluentValidation.Blazor

Install-Package FluentValidation.Blazor

2. Создайте класс для правил валидации пароля. Например, создайте класс PasswordValidator, который наследует от AbstractValidator:

public class PasswordValidator : AbstractValidator
{
    public PasswordValidator()
    {
        RuleFor(x => x).NotEmpty().WithMessage("Password is required")
                       .MinimumLength(8).WithMessage("Password must be at least 8 characters");
    }
}

public class PasswordValidator : AbstractValidator { public PasswordValidator() { RuleFor(x => x).NotEmpty().WithMessage("Password is required") .MinimumLength(8).WithMessage("Password must be at least 8 characters"); } }

3. В вашем компоненте Blazor, используйте FluentValidationValidator для привязки правил валидации:

 

4. Теперь привяжите этот валидатор к полю ввода пароля, используя директиву ValidatorFor:

 

5. Теперь, при вводе пароля пользователем, он будет валидироваться согласно заданным правилам. В случае нарушения правил, пользователю будет показано сообщение об ошибке.

Это основные шаги для настройки валидации пароля в Blazor с использованием FluentValidation. Не забудьте настроить другие правила валидации по вашим требованиям.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно