Pregunta

En realidad estoy bien con el uso de otro método de validación.Parece que no hay muchas opciones predefinidas para hacer la validación con ASP.NET MVC 1.0.La principal cosa que ver a la gente hablando de xVal.Sin embargo, hay literalmente ninguna documentación.De hecho, el blog del fundador parece que sólo tienen como dos puestos en él.

De todos modos, es la única cosa que he visto que también puede proporcionar la validación del lado del cliente.Mi problema es que no puedo utilizar el atributo basado cosas porque soy de la generación de mis modelos utilizando LLBLGen y no quiero modificar el código.

Todo lo que he leído acerca de xVal, habla de la posibilidad de la implementación de un IRulesProvider pero no hay información real de cómo hacerlo y usarlo.He encontrado algo de código que la implementa, pero mediante el uso de atributos que realmente no puedo hacer.

Así que ¿alguien puede proporcionar algunas orientaciones sobre cómo usar xVal si no estoy en la mano de codificación mi modelo de clases o va a utilizar DataAnnotations o algo similar (estoy abierto a una alternativa a xVal pero no he visto nada y tengo que pegar con ASP.NET MVC 1.0 y necesito de lado de cliente de soporte de validación)?

Editar: Yo no creo que una clase parcial enfoque de trabajo para mí, porque me va a generar el código de un lote y que será en las diferentes asambleas.

¿Fue útil?

Solución

Puede utilizar XVal con LLBLGen o cualquier otro ORM generada clases utilizando el atributo MetadataType en una clase parcial. Por ejemplo, si tiene una entidad generada LLBL llamada UserEntity debe crear una clase parcial y se marca con un atributo MetadataType como esto:

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

Va a crear la clase de Meta donde se puede markup las propiedades con los atributos apropiados como esta:

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

Esto le permitirá no tiene que cambiar el código generado LLBL, sólo las clases personalizadas parciales. El único inconveniente es que tendrá que tanto la clase parcial y la clase Meta en el mismo espacio de nombres que las clases de entidad generados. Usted no tiene que hacer esto, pero hace las cosas más fáciles cuando se llama a la validación XVal.

Otros consejos

Además de lo dicho jcerhea también es necesario modificar la forma en la clase DataAnnotationsValidationRunner está configurado para manejar las clases "amigo" en el método GetErrors, por ejemplo.

    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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top