Выборочная проверка в разъяснении MVC2 - по примеру Скотта Гу - PullRequest
1 голос
/ 09 марта 2011

Я пытаюсь реализовать проверку данных в моем приложении asp.net mvc 2, следуя хорошему посту Скотта Гу: http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

Мне нужно больше, чем базовая проверка (обязательно, Range, StringLength ...)

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

См:

Шаг 4. Создание пользовательского атрибута проверки [Email]

Пространство имен System.ComponentModel.DataAnnotations в .NET Framework включает в себя ряд встроенных атрибутов проверки, которые вы можете использовать. В приведенном выше примере мы использовали 4 разных типа - [Обязательный], [StringLength], [Range] и [RegularExpression].

Вы также можете при желании определить свои собственные атрибуты проверки и использовать их. Вы можете определить полностью настраиваемые атрибуты, производные от базового класса ValidationAttribute в пространстве имен System.ComponentModel.DataAnnotations. В качестве альтернативы вы можете выбрать любой из существующих атрибутов проверки, если вы хотите просто расширить их базовую функциональность.

Так что это то, что я до сих пор ... Куда я иду отсюда ???

(Обратите внимание, что я упростил это ради моей проблемы, я понимаю, что для проверки объектов-дубликатов в реальной жизни вам придется сделать больше, чем просто проверить имя и фамилию)

[MetadataType(typeof(PersonMetaData))]
public partial class Person
{
    //Validation rules for the Person class

    [Bind(Exclude = "PersonID")]
    public class PersonMetaData
    {
        //[DisplayName("Person")]
        [Required(ErrorMessage =  "A Person Code is required")]
        [DuplicatePerson(ErrorMessage = "Bad!")]
        public object PersonCode { get; set; }
    }
}

public class DuplicatePersonAttribute : ValidationAttribute
{
    readonly PeopleDB peopleDB = new PeopleDB();

    public  bool IsDuplicate(object value)
    {
        //var isDuplicate = peopleDB.People.Select(x => x.PersonCode == value);

        //Return false if duplicate in DB

        return false;
    }
}

Ответы [ 2 ]

0 голосов
/ 26 марта 2011

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

[AttributeUsage (AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] открытый класс UniqueEmailAttribute: ValidationAttribute {publicUniqueEmailAttribute (): base («Значение для« {0} »уже занято») {}

public override bool IsValid( object value )
{
    string toCheck = value as string;
    if( String.IsNullOrEmpty(toCheck) ) return false;

    return ( DataRepository.GetMembersByEmail(toCheck).Count() == 0 );
}

[Inject]
public IDataRepository DataRepository { get; set; }

}

Единственное, что не может быть достаточно очевидным здесьявляется атрибутом [Inject], украшающим свойство DataRepository.Он предоставляется библиотекой nInject как средство для внедрения зависимости (инверсии управления), чтобы я мог отделить доступ к базе данных от приложения.Но до включения DI я просто заставил атрибут создать экземпляр конкретного объекта DataRepository и использовал его (конечно, это не очень хорошая практика, поэтому я пошел по пути nInject).

0 голосов
/ 09 марта 2011

После SoC (Разделение проблем) вы не должны выполнять такую ​​проверку на модели, а скорее на контроллере.

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