валидация asp mvc, специфичная для действий контроллеров? - PullRequest
1 голос
/ 26 июня 2010

Может ли встроенная проверка ASP MVC вести себя по-разному для разных действий одного и того же контроллера? Например, у меня есть пользовательский контроллер, и у него есть такие действия, как создание, редактирование и другие действия. Таким образом, в модели пользователя атрибут Имя пользователя проверяется на его уникальность. Если есть пользователь с таким же именем пользователя, он выдает сообщение об ошибке и имя пользователя уже присутствует. Таким образом, использование одного и того же валидатора для действия редактирования выдает ошибку «имя пользователя уже присутствует» при редактировании пользователя. Кто-нибудь может сказать мне, если есть способ решить эту проблему? Я вставляю свой код валидатора для справки.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;  

    namespace Models
    {
        [MetadataType(typeof(AdmiUserMetadata))]
        public partial class AdminUser
        {
            public class AdmiUserMetadata
            {
                [Required(ErrorMessage = "Required Field")]
                public string Id { get; set; }

                [Required(ErrorMessage = "Required Field")]
                [RegularExpression("[\\S]{6,}", ErrorMessage = "Must be at least 6 characters.")]
                [Username(ErrorMessage = "Username already taken")]
                public string Username { get; set; }

                [Required(ErrorMessage = "Required Field")]
                [RegularExpression("[\\S]{6,}", ErrorMessage = "Must be at least 6 characters.")]
                public string Password { get; set; }

                [Required(ErrorMessage = "Required Field")]
                public string Name { get; set; }

                [Required(ErrorMessage = "Required Field")]
                [RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2,4})$", ErrorMessage ="Invalid E-mail ID")]
                public string Email { get; set; }

                [Required(ErrorMessage = "Required Field")]
                [RegularExpression("(Active|Disabled)", ErrorMessage = "Select the status of User")]
                public string Status { get; set; }

                [Required(ErrorMessage = "Required Field")]
                [RegularExpression("^[1-9]", ErrorMessage = "Select the group of User")]
                public string Group { get; set; }
            }
        }

        public class UsernameAttribute : ValidationAttribute
        {
            IUserRepository _repository = new UserRepository();
            public override bool IsValid(object value)
            {
                if (value == null)  
                    return true;
                if (_repository.IsUsernamePresent((string)value))
                {
                    return false;
                }
                return true;
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 26 июня 2010

То, что вы проверяете, является бизнес-правилом.

No two users can have the same username.

У меня будет служба пользователя, которая применяет это правило при создании / редактировании.Атрибуты лучше всего подходят для проверки входных данных.(например, является ли целое число неотрицательным? Действительный адрес электронной почты? и т. д.)

0 голосов
/ 26 июня 2010

Я не вижу, как это можно сделать, если у класса есть атрибуты, которые определяют валидацию.Это, очевидно, работает для большинства проектов, но для меня это также не работает.

Если вам нужно присоединить различные наборы правил проверки, посмотрите http://fluentvalidation.codeplex.com/. Я попробовал и мне понравилось

Не обрабатывает проверку клиента.Я отбросил это, потому что у меня есть вызовы ajax в большинстве частей, и это похоже на проверку клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...