Вопрос

Я на самом деле в порядке с использованием другого метода проверки. Кажется, что не так много вариантов, предварительно построенных для проверки с ASP.NET MVC 1.0. Главное, о чем я вижу, - это xval. Тем не менее, для этого буквально нет документации. На самом деле, в блоге основателя, похоже, есть только два сообщения на нем.

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

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

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

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

Это было полезно?

Решение

You can use xVal with LLBLGen or any other ORM generated classes by using the MetadataType attribute on a partial class. For example if you have a LLBL generated entity called UserEntity you would create a partial class and mark it up with a MetadataType attribute like this:

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

You will than create the Meta class where you can markup the properties with the appropriate attributes like this:

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; }
}

This will allow you to not have to change the LLBL generated code, just your custom partial classes. The only catch is that you will want both the partial class and the Meta class in the same namespace as the generated entity classes. You do not have to do this, but it makes things easier when you call the xVal validation.

Другие советы

In addition to what jcerhea said you also need to modify how the DataAnnotationsValidationRunner class is set up to handle the "buddy" classes in the GetErrors method, e.g.

    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);
            }
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top