I'm trying to validate user input in password form using razor pages. I have the following model
public class UserPassword
{
public Guid? Id{ get; set; }
public string Code { get; set; }
[StringLength(32, MinimumLength = 8, ErrorMessage = "The password must at least be 8 characters")]
[RegularExpression("[A-Z]", ErrorMessage = "The password Must contain atleast one uppercase character")]
public string Password { get; set; }
[Compare("Password")]
public string ConfirmedPassword { get; set; }
}
With the generated .cshtlm
@page "{id}/{code}"
@model AuthenticationService.Pages.UserPasswordModel
@{
ViewData["Title"] = "UserPassword";
}
<hr />
<div class="row">
<div class="col-md-4">
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="UserPassword.Password" class="control-label"></label>
<input asp-for="UserPassword.Password" class="form-control" />
<span asp-validation-for="UserPassword.Password" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="UserPassword.ConfirmedPassword" class="control-label"></label>
<input asp-for="UserPassword.ConfirmedPassword" class="form-control" />
<span asp-validation-for="UserPassword.ConfirmedPassword" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" />
</div>
</form>
</div>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Additionally the OnGet()
and OnPostAsync()
methods can be seen below
public IActionResult OnGet()
{
if (!ModelState.IsValid)
{
return Page();
}
return Page();
}
[BindProperty]
public UserPassword UserPassword { get; set; }
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
UserPassword.Id = Guid.Parse(RouteData.Values["id"].ToString());
UserPassword.Code = Base64Utility.UrlSafeDecode(RouteData.Values["code"].ToString());
var user = await _userManager.FindByIdAsync(UserPassword.Id.ToString());
var result = await _userManager.ConfirmEmailAsync(user, UserPassword.Code);
if (result.Succeeded)
{
await _userManager.RemovePasswordAsync(user);
await _userManager.AddPasswordAsync(user, UserPassword.ConfirmedPassword);
return RedirectToPage("./Confirmation");
}
return RedirectToPage("./Error");
}
My problem is with the Data annotation regular expression. The regular expression only matches the first character of the input form, and when additional characters are added to the input form the ErrorMessage
"Must contain an uppercase character" are shown, even when there are multiple uppercase character as seen in the image below.