skip to Main Content

Why does the console display validation errors but ValidationSummary does not display them? How to make ValidationSummary display User Validation failed?

photo of the console

RegisterView Code

@Html.ValidationSummary()

<h4>Name</h4>
@Html.TextBoxFor(model => model.Name)

<h4>Email</h4>
@Html.TextBoxFor(model => model.Email)

<h4>Pasword</h4>
@Html.TextBoxFor(model => model.Pasword)

<h4>ConfirmPasword</h4>
@Html.TextBoxFor(model => model.ConfirmPasword)

<h4>RememberMe</h4>
@Html.CheckBoxFor(model => model.RememberMe)

<button type="submit">Register</button>
photo of the Controller

Controller code

[HttpPost("Register")]
        public async Task<ActionResult> Register(RegisterViewModle modle)
        { 
            if (!ModelState.IsValid) { return View(modle); }
            var user = new ApplicationUser { Email = modle.Email, UserName = modle.Name };
            var result = await _UserManeger.CreateAsync(user, modle.Pasword);
            var roleResult = await _UserManeger.AddClaimAsync(user, new Claim(ClaimTypes.Role, "User"));
            if (result.Succeeded & roleResult.Succeeded)
            {
                await _SignInManager.SignInAsync(user, isPersistent:false);
                return Redirect("https://localhost:7195/user");
            }
           
            return View(modle);
        }

2

Answers


  1. For your customs error messages you need to add ModelState.AddModelError method.

     if(emailAlreadyExists)
                {
                    //adding error message to ModelState
     ModelState.AddModelError("email", "Email Already Exists.");
        
                  
                }
    

    ModelState treats your errors exactly the way it treats errors generated by model binding. When you add an error using AddModelError, the ModelState’s IsValid property is automatically set to false.

    Also The ValidationSummary() method will automatically display all the error messages added into the ModelState.

    The Basis of Validation

    How Model State works

    Login or Signup to reply.
  2. If you cannot see the error when debugging, maybe try the code in your UserValidator as below:

                List<IdentityError> errors = new List<IdentityError>();
                if (userManager.FindByEmailAsync(user.Email) != null)
                {
                    errors.Add(new IdentityError { Code = "EmailFilad", Description = "Эта почта уже используется" });
                }
                if (errors.Count == 0)
                { return IdentityResult.Success; }
    
    
                else return IdentityResult.Failed(errors.ToArray());
    

    enter image description here

    If you want to see the error in the view, you can add below code in your Register action .

        [HttpPost]
        public async Task<ActionResult> Register(RegisterViewModle modle)
        { 
            if (!ModelState.IsValid) { return View(modle); }
            var user = new ApplicationUser { Email = modle.Email, UserName = modle.Name };
            var result = await _UserManeger.CreateAsync(user, modle.Pasword);
            var roleResult = await _UserManeger.AddClaimAsync(user, new Claim(ClaimTypes.Role, "User"));
            if (result.Succeeded & roleResult.Succeeded)
            {
                await _SignInManager.SignInAsync(user, isPersistent:false);
                return Redirect("https://localhost:7195/user");
            }
           foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            return View(modle);
        }
    

    Result:

    enter image description here

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search