Проверка ASP.NET MVC 1.0 с помощью xVal - PullRequest
1 голос
/ 17 января 2010

На самом деле я в порядке с использованием другого метода проверки. Похоже, что не так много параметров для проверки в ASP.NET MVC 1.0. Главное, что я вижу, люди говорят о xVal. Тем не менее, буквально нет документации для этого. На самом деле, блог основателя, похоже, содержит только две записи.

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

Все, что я читал о xVal, говорит о возможности реализации IRulesProvider, но не содержит реальной информации о том, как это сделать и как его использовать. Я нашел код, который его реализует, но с использованием атрибутов, которые я не могу сделать на самом деле.

Так может кто-нибудь дать некоторые рекомендации о том, как использовать xVal, если я не пишу вручную свои классы моделей или собираюсь использовать DataAnnotations или что-то подобное (я открыт для альтернативы xVal, но я ничего не видел и Мне нужно придерживаться ASP.NET MVC 1.0, и мне нужна поддержка проверки на стороне клиента)?

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

Ответы [ 2 ]

4 голосов
/ 17 января 2010

Вы можете использовать xVal с LLBLGen или любыми другими классами, сгенерированными ORM, используя атрибут MetadataType в частичном классе. Например, если у вас есть объект, сгенерированный LLBL с именем UserEntity, вы должны создать частичный класс и пометить его атрибутом MetadataType, например:

[MetadataType(typeof(UserEntityMetaData))]
public partial class UserEntity
{
}

Затем вы создадите класс Meta, в котором вы можете разметить свойства с помощью соответствующих атрибутов, например:

public class UserEntityMetaData
{
    [Required()]
    [StringLength(50)]
    [DataType(DataType.EmailAddress)]
    public object EmailAddress { get; set; }
    [Required()]
    [StringLength(32)]
    [DataType(DataType.Password)]
    public object Password { get; set; }
    [Required()]
    [StringLength(25)]
    public object FirstName { get; set; }
    [Required()]
    [StringLength(25)]
    public object LastName { get; set; }
}

Это позволит вам не изменять код, сгенерированный LLBL, только ваши собственные частичные классы. Единственный улов заключается в том, что вам понадобится и частичный класс, и мета-класс в том же пространстве имен, что и сгенерированные классы сущностей. Вам не нужно этого делать, но это облегчает задачу, когда вы вызываете проверку xVal.

1 голос
/ 18 января 2010

В дополнение к тому, что сказал jcerhea, вам также необходимо изменить настройку класса DataAnnotationsValidationRunner для обработки классов «собеседника» в методе GetErrors, например,

    namespace Entities
    {
        public static class DataAnnotationsValidationRunner
        {
            public static IEnumerable<ErrorInfo> GetErrors(object instance)
            {
                var metadataAttrib = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();
                var buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : instance.GetType();
                var buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass).Cast<PropertyDescriptor>();
                var modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast<PropertyDescriptor>();

                return from buddyProp in buddyClassProperties
                       join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name
                       from attribute in buddyProp.Attributes.OfType<ValidationAttribute>()
                       where !attribute.IsValid(modelProp.GetValue(instance))
                       select new ErrorInfo(buddyProp.Name, attribute.FormatErrorMessage(string.Empty), instance);
            }
        }
    }
...