Как правильно настроить валидацию пароля в Blazor FluentValidation?
Есть класс
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 работает, с другим не работает.
Дополнительно:
Ответы:
Вы используете
fv.RegisterValidatorsFromAssemblyContaining<LoginModelValidation>()) |
fv.RegisterValidatorsFromAssemblyContaining<LoginModelValidation>())
Это автоматическая регистрация сервисов валидаци, но она не работает на .net 8 (И, вроде бы на .net 7, но жто не точно). По этому, если вы используете указанную версию .net, вас все валидаторы нужно регистрировать вручную
- Может я не так написал. Но валидация со всеми типами input Работает корректно кроме type="password". Если я в этом же инпуте поменяю тип на text, то валидация отрабатывает
-
- я думал может на гитхабе майкам тикет создать. Выглядит как косяк с их стороны
- 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
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос


Для настройки валидации пароля в Blazor с использованием FluentValidation, вам необходимо выполнить несколько шагов.
1. Установите пакет FluentValidation для Blazor, выполнив команду в консоли NuGet Package Manager:
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"); } }
3. В вашем компоненте Blazor, используйте FluentValidationValidator для привязки правил валидации:
4. Теперь привяжите этот валидатор к полю ввода пароля, используя директиву ValidatorFor:
5. Теперь, при вводе пароля пользователем, он будет валидироваться согласно заданным правилам. В случае нарушения правил, пользователю будет показано сообщение об ошибке.
Это основные шаги для настройки валидации пароля в Blazor с использованием FluentValidation. Не забудьте настроить другие правила валидации по вашим требованиям.