Pergunta

Na verdade, estou bem com o uso de outro método de validação. Parece que não há muitas opções pré -criadas para fazer validação com o ASP.NET MVC 1.0. A principal coisa de que vejo pessoas falando é XVAL. No entanto, literalmente não há documentação para isso. De fato, o blog do fundador parece ter apenas duas postagens.

De qualquer forma, é a única coisa que já vi que também pode fornecer validação do cliente. Meu problema é que não posso usar coisas baseadas em atributos, porque estou gerando meus modelos usando o llblgen e não quero modificar o código.

Tudo o que li sobre o XVAL fala sobre a possibilidade de implementar um IrulesProvider, mas nenhuma informação real de como fazer isso e usá -lo. Encontrei algum código que o implementa, mas usando atributos que eu realmente não posso fazer.

Então, alguém pode fornecer algumas orientações sobre como usar o XVAL se eu não estiver codificando as aulas de minhas modelos ou vou usar o DataNotações ou algo semelhante (estou aberto a uma alternativa ao XVAL, mas não vi nada e preciso Fique com o ASP.NET MVC 1.0 e eu preciso de suporte à validação do lado do cliente)?

Editar: Não acho que uma abordagem de classe parcial funcione para mim, porque eu estarei gerando muito o código e eles estarão em diferentes montagens.

Foi útil?

Solução

Você pode usar o XVAL com o LLBLGEN ou qualquer outra classes geradas pelo ORM usando o atributo Metadatatype em uma classe parcial. Por exemplo, se você tiver uma entidade gerada por LLBL chamada Userentity, você criaria uma classe parcial e a marcará com um atributo metadatatype como este:

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

Você vai criar a meta -classe, onde pode marcar as propriedades com os atributos apropriados como este:

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

Isso permitirá que você não precise alterar o código gerado por LLBL, apenas suas classes parciais personalizadas. O único problema é que você deseja a classe parcial e a meta -classe no mesmo espaço de nome das classes de entidade geradas. Você não precisa fazer isso, mas isso facilita as coisas quando você chama a validação XVAL.

Outras dicas

Além do que a JCERHEA disse que você também precisa modificar como a classe DataNoTationsValidationRunner está configurada para lidar com as classes "Buddy" no método getErrors, por exemplo,

    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);
            }
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top