Tenho um formulário da web para capturar alguns detalhes de um usuário para enviar ao backend. O formulário de registro tem uma classe de modelo chamada RegisterModel
que valida todas as entradas que o usuário insere naquele formulário. O estado do modelo não gera erros para os outros campos quando insiro uma entrada que satisfaz as condições necessárias, mas gera um erro para o campo de confirmação de senha, mesmo que o campo não esteja vazio e corresponda à entrada de senha anterior.
RegisterModel
:
[Required(ErrorMessage ="The password field is required")]
[MinLength(8, ErrorMessage ="The password needs to be at least eight characters long")]
[MaxLength(50, ErrorMessage ="The password length cannot exceed fifty characters")]
[RegularExpression("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\W).+$", ErrorMessage = "Password must contain at least one uppercase letter, one lowercase letter, and one special character.")]
public string Password { get; set; }
[Required(ErrorMessage = "You have to confirm the password")]
[Compare("Password", ErrorMessage = "The passwords do not match")]
public string Confirmpassword { get; set; }
Dados de código para o formulário de registro com todos os atributos de controlador e nome de ação necessários
Formulário de inscrição:
@model Christian_Social.Models.RegisterModel
<div class="container">
<div class="text-center">
<h4 style="color:blue">Create a new account to proceed</h4>
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card mt-5">
<div class="card-body">
<form asp-controller="Register" asp-action="CreateEntry" method="post">
<div class="mb-3">
<label for="username" class="form-label">Username</label>
<input type="text" class="form-control" id="username" name="username"asp-for=username required>
<span class="text-danger" style="color:red" asp-validation-for="username"></span>
</div>
<div class="mb-3">
<label for="email" class="form-label">Email</label>
<input type="email" class="form-control" id="email" name="email" asp-for="Email" required>
<span class="text-danger" style="color:red" asp-validation-for="Email"></span>
</div>
<div class="mb-3">
<label for="password" class="form-label">Password</label>
<input type="password" class="form-control" id="password" name="password" asp-for="Password"required>
<span class="text-danger" style="color:red" asp-validation-for="Password"></span>
</div>
<div class="mb-3">
<label for="confirm-password" class="form-label">Confirm Password</label>
<input type="password" class="form-control" id="confirm-password" name="confirm-password" asp-for="Confirmpassword" required>
<span class="text-danger" style="color:red" asp-validation-for="Confirmpassword"></span>
</div>
<button type="submit" class="btn btn-primary">Register</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
Veja como estou lidando com a lógica do controlador quando o formulário é enviado:
RegisterController
:
public class RegisterController : Controller
{
private readonly DatabaseContext databaseContext;
public RegisterController(DatabaseContext dataContext)
{
databaseContext = dataContext;
}
public IActionResult CreateEntry(RegisterModel registerModel)
{
if (ModelState.IsValid)
{
// return the account created successfully page
// encrypt the password, since passwords are private
var encryptedPassword = BCrypt.Net.BCrypt.HashPassword(registerModel.Password);
var userName = registerModel.username;
var email = registerModel.Email;
// create a new database entity
var entity = new User
{
Username = userName,
Email = email,
Password = encryptedPassword,
};
// make sure you are not adding duplicate entries
var user = databaseContext.Users.Where(p=>p.Email == email).FirstOrDefault();
if (user == null)
{
// entry does not exist, add a new one
databaseContext.Add(entity);
// save changes
databaseContext.SaveChanges();
return View("~Views/Home/Index");
}
else
{
// add errors to the model state and return the same view
ModelState.AddModelError("Email", "That email is already taken");
return View("~Views/Home/Register", registerModel);
}
}
else
{
return View("~/Views/Home/Register.cshtml", registerModel);
}
}
}
Por que meu formulário está retornando o erro quando o campo tem uma senha e ela corresponde à entrada no campo de senha?