Frage

Mir geht es gut mit einer anderen Validierungsmethode. Es scheint, dass es nicht viele Optionen für die Validierung mit ASP.NET MVC 1.0 vorhanden ist. Die Hauptsache, über die Leute sprechen, ist XVAL. Es gibt jedoch buchstäblich keine Dokumentation dafür. Tatsächlich scheint der Blog des Gründers nur zwei Beiträge zu haben.

Wie auch immer, es ist das einzige, was ich gesehen habe, das auch Kundenvalidierung bieten kann. Mein Problem ist, dass ich keine Attributbasis verwenden kann, da ich meine Modelle mit LLBLGEN generiere und den Code nicht ändern möchte.

Alles, was ich über XVAL gelesen habe, spricht über die Möglichkeit, einen IruleProvider implementieren zu können, aber keine wirklichen Informationen darüber, wie man das macht und ihn benutzt. Ich habe einen Code gefunden, der ihn implementiert, aber Attribute verwendet, die ich nicht wirklich tun kann.

Kann jemand eine Anleitung zur Verwendung von XVAL geben, wenn ich meine Modellklassen nicht von Hand codiere oder Datenanaltationen oder ähnliches verwendet werde (ich bin offen für eine Alternative zu XVAL, aber ich habe nichts gesehen und ich muss es müssen Bleiben Sie bei ASP.NET MVC 1.0 und ich benötige Client -Seitenvalidierungsunterstützung)?

Bearbeiten: Ich glaube nicht, dass ein Teilklassenansatz für mich funktionieren wird, weil ich den Code viel generieren werde und sie in verschiedenen Versammlungen sein werden.

War es hilfreich?

Lösung

Sie können XVAL mit LLBLGen oder anderen Orm -generierten Klassen verwenden, indem Sie das Metadatyp -Attribut für eine Teilklasse verwenden. Wenn Sie beispielsweise eine LLBL -generierte Entität namens UserEntity haben, würden Sie eine Teilklasse erstellen und sie mit einem solchen Metadatyp -Attribut markieren:

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

Sie werden als die Meta -Klasse erstellen, in der Sie die Eigenschaften mit den entsprechenden Attributen wie folgt markieren können:

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

Auf diese Weise müssen Sie den LLBL -generierten Code nicht ändern, sondern nur Ihre benutzerdefinierten Teilklassen. Der einzige Haken ist, dass Sie sowohl die Teilklasse als auch die Metaklasse im gleichen Namespace wie die generierten Entitätsklassen haben möchten. Sie müssen dies nicht tun, aber es macht die Dinge einfacher, wenn Sie die XVAL -Validierung anrufen.

Andere Tipps

Zusätzlich zu dem, was Jcerhea gesagt hat, müssen Sie auch ändern, wie die DataAnnotations -ValidationRunner -Klasse für die Behandlung der "Buddy" -Klasse in der Geterrors -Methode eingerichtet ist, z. B.

    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);
            }
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top