Question

Je suis en fait très bien avec une autre méthode de validation. Il semble qu'il n'y a pas beaucoup d'options pour faire préconstruits validation avec ASP.NET MVC 1.0. La principale chose que je vois des gens parler est xVal. Cependant, il n'y a littéralement pas de documentation pour elle. En fait, le blog du fondateur semble avoir que comme deux postes sur elle.

Quoi qu'il en soit, il est la seule chose que j'ai vu qui peut également fournir une validation client. Mon problème est que je ne peux pas utiliser attribuer des choses à base parce que je suis la génération de mes modèles en utilisant LLBLGen et je ne veux pas modifier le code.

Tout ce que j'ai lu des discussions xVal sur la possibilité de mettre en œuvre un IRulesProvider mais pas vraiment d'informations sur la façon de s'y prendre le faire et l'utiliser. J'ai trouvé un code qui implémente mais en utilisant des attributs que je ne peux pas vraiment faire.

Alors quelqu'un peut-il fournir des conseils sur la façon d'utiliser xVal si je suis la main non de codage mes classes de modèle ou allez utiliser DataAnnotations ou quelque chose de similaire (je suis ouvert à une alternative à xVal mais je n'ai rien vu et Je dois coller avec ASP.NET MVC 1.0 et je besoin d'aide de validation côté client)?

Edit:. Je ne pense pas une approche de classe partielle travaillera pour moi parce que je vais générer le code beaucoup et ils seront dans différentes assemblées

Était-ce utile?

La solution

Vous pouvez utiliser xVal avec LLBLGen ou tout autre ORM généré des classes en utilisant l'attribut MetadataType sur une classe partielle. Par exemple, si vous avez une entité générée de LLBL appelé UserEntity vous créer une classe partielle et marquer avec un attribut MetadataType comme ceci:

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

Vous que créer la classe Meta où vous pouvez baliser les propriétés avec les attributs appropriés comme ceci:

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

Cela vous permettra d'avoir de ne pas modifier le code généré LLBL, juste vos classes partielles personnalisées. Le seul hic est que vous voulez à la fois la classe et la classe partielle Meta dans le même espace que les classes d'entités générées. Vous ne devez pas faire cela, mais cela rend les choses plus facile lorsque vous appelez la validation xVal.

Autres conseils

En plus de ce jcerhea dit que vous devez également modifier la façon dont la classe DataAnnotationsValidationRunner est mis en place pour gérer les classes « amis » dans la méthode GetErrors, par exemple.

    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);
            }
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top