Как отобразить несколько сообщений об ошибках от модели в моей форме регистрации

#c# #asp.net

Вопрос:

У меня есть форма регистрации с такими полями, как: Электронная почта, имя пользователя, пароль и т. Д. И иметь определенные проверки для всех из них, например, электронная почта должна иметь@, длина имени пользователя должна составлять не менее 5 букв, пароль должен совпадать и т. Д. На данный момент я настроил ответ на сообщение об ошибке, в котором будет показана ошибка, но я хочу показать все ошибки. Как я могу это сделать?

Вот моя модель ответа пользователя:

 public class UserManagerResponse
    {
        public string AccessToken { get; set; }

        public string ErrorMessage { get; set; }
        public bool IsSuccess { get; set; }
        public IEnumerable<Claim> Claims { get; set; }
      //public IEnumerable<string> Errors { get; set; } <--- should i use this?
        public DateTime? ExpireDate { get; set; }
    }
 

Это то, что происходит, когда пользователи нажимают на кнопку регистрация, чтобы зарегистрироваться для учетной записи:

 public async Task<UserManagerResponse> RegisterUserAsync(RegisterRequest model)
{

        if (model == null)
           throw new NullReferenceException("Register Model is null");
        if (model.Password != model.ConfirmPassword)
                return new UserManagerResponse
                {
                    ErrorMessage = "The passwords you have entered do not match",
                    IsSuccess = false,
                };
        if (model.Password.length < 5) 
                return new UserManagerResponse
                {
                    ErrorMessage = "Password length must be greater than 5",
                    IsSuccess = false,
                };
                     

}
 

Если пользователь переходит в модель, что-то вроде… Пароль: «lol1», а затем подтвердите: «lool1»

Я хочу, чтобы мои сообщения об ошибках были такими: Введенные вами пароли не совпадают, длина пароля должна быть больше 5

Как я могу этого достичь?

Спасибо!

Ответ №1:

Ваша проблема в том, что вы возвращаетесь, как только обнаружите первую ошибку, поэтому остальные ваши тесты никогда не будут выполнены — вы можете вернуться только один раз. Что вы можете сделать, так это создать ответ по ходу работы и отправить его только в конце:

 public async Task<UserManagerResponse> RegisterUserAsync(RegisterRequest model) {

    if (model == null) {
       throw new NullReferenceException("Register Model is null");
    }

    //create error message string and boolean to track errors here
    UserManagerResponse response = new UserManagerResponse{
        IsSuccess = true,
        ErrorMessage = ""
    };
 
    if (model.Password != model.ConfirmPassword) {
        response.ErrorMessage  = "The passwords you have entered do not match. ";
        response.IsSuccess = false;
    }

    if (model.Password.Length < 5) {
        response.ErrorMessage  = "Password length must be greater than 5. ");
        response.IsSuccess = false;
    }

    //any other tests here built the same way

    if (response.isSuccess){
        //success functions here
    }

    return response;
}
 

Таким образом, ваш результат будет:

Введенные вами пароли не совпадают. Длина пароля должна быть больше 5.


Я бы предложил иметь отдельные строки для каждого сообщения об ошибке, это чище и проще для чтения, особенно если вы получаете их много. Для этого вы должны создать новую строку для каждой добавленной ошибки:

 response.ErrorMessage  = "The passwords you have entered do not match.n";
 

И в конце, прежде чем вы вернетесь, очистите дополнительную новую строку:

 response.ErrorMessage = response.ErrorMessage.Trim();
 

Ответ №2:

Проверка модели представления может быть выполнена до того, как будут применены какие-либо методы контроллера, путем украшения модели атрибутами. Кроме того, сложность также проверяется тем, что было настроено в файле startup.cs. Эти ошибки должны автоматически отображаться в представлении, если вы используете стандартные модели

 public class RegisterViewModel
{
    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Compare("Password")]
    public string ConfirmPassword { get; set; }
}