Domanda

Sono davvero bene con un altro metodo di validazione. Sembra che non ci sono molte opzioni predefiniti per fare la convalida con ASP.NET MVC 1.0. La cosa principale che vedo la gente parlando è xVal. Tuttavia, non v'è letteralmente alcuna documentazione per esso. In realtà, il blog del fondatore sembra avere solo come due messaggi su di esso.

In ogni caso, è l'unica cosa che ho visto, che può anche fornire la convalida del client. Il mio problema è che non posso usare attribuire roba basato perché sto generando i miei modelli utilizzando LLBLGen e non voglio modificare il codice.

Tutto quello che ho letto su ValX parla della possibilità di implementare un IRulesProvider ma nessuna vera informazioni su come fare per farlo e usarlo. Ho trovato un po 'di codice che implementa, ma con attributi che non posso fare.

Quindi, chiunque può fornire alcune indicazioni su come utilizzare xVal se non sono d'uso e le classi del modello o che verrà usata DataAnnotations o qualcosa di simile (sono aperto a un'alternativa al xVal ma non ho visto nulla e ho bisogno di attaccare con ASP.NET MVC 1.0 e ho bisogno di supporto validazione lato client)?

Modifica:. Non credo che un approccio classe parziale lavorerà per me, perché io sarò la generazione del codice molto ed essi saranno in diverse assemblee

È stato utile?

Soluzione

È possibile utilizzare xVal con LLBLGen o qualsiasi altro ORM generato classi utilizzando l'attributo MetadataType su una classe parziale. Per esempio, se si dispone di un'entità generato LLBL chiamato UserEntity si creerebbe una classe parziale e segnare con un attributo MetadataType in questo modo:

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

Sarà di creare la classe di Meta in cui è possibile marcare le proprietà con gli attributi appropriati in questo modo:

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

Questo vi permetterà di non dover modificare il codice generato LLBL, solo le classi parziali personalizzati. L'unico problema è che si vuole sia la classe parziale e la classe Meta nello stesso namespace le classi di entità generate. Non è necessario per fare questo, ma rende le cose più facili quando si chiama la convalida xVal.

Altri suggerimenti

In aggiunta a quanto detto jcerhea è inoltre necessario modificare come la classe DataAnnotationsValidationRunner è configurato per gestire le classi "Buddy" nel metodo GetErrors, per es.

    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);
            }
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top