Pregunta

A partir de mi experiencia muchos marcos de validación en .NET le permiten validar un solo campo a la vez para hacer las cosas como garantizar la igualdad es una dirección de correo electrónico de código postal, o por ejemplo. Yo suelo llamar estas modificaciones dentro del campo.

En mi proyecto a menudo tenemos que hacer entre campo-edita sin embargo. Por ejemplo, si usted tiene una clase como esta:

public class Range
{
    public int Min { get; set; }
    public int Max { get; set; }
}

es posible que desee asegurarse de que Max es mayor que Min. También puede ser que desee hacer una validación con un objeto externo. Por ejemplo dado tiene una clase como esta:

public class Person
{
    public string PostalCode { get; set; }
}

y por cualquier motivo desea asegurarse de que el Código Postal existe en una base de datos o un archivo proporcionado. Tengo ejemplos más complejos, como los que un usuario proporciona un diccionario de datos y que desea validar el objeto contra el que el diccionario de datos.

Mi pregunta es: ¿se puede utilizar cualquiera de los marcos existentes de validación (TNValidate, NHibernate Validator) para .NET o tenemos que utilizar un motor de reglas o qué ?? ¿Cómo hacer que la gente en el mundo verdadero negocio con esta situación? : -)

¿Fue útil?

Solución

Sólo hay un marco de validación que conozco bien y que es Enterprise Library Validación bloque de aplicación o VAB para abreviar. Voy a responder a las preguntas del contexto del VAB.

Primera pregunta:? ¿Se puede hacer el estado (entre el campo) en la validación VAB

Sí se puede. Hay varias maneras de hacer esto. Usted puede elegir para el mecanismo de validación de uno mismo, de la siguiente manera:

[HasSelfValidation]
public class Range
{
    public int Min { get; set; }
    public int Max { get; set; }

    [SelfValidation]
    public void ValidateRange(ValidationResults results)
    {
        if (this.Max < this.Min)
        {
            results.AddResult(
                new ValidationResult("Max less than min", this, "", "", null));
        }
    }
}

Debo decir que personalmente no me gusta este tipo de validaciones, especialmente cuando se validan mis entidades del dominio, porque me gusta mantener mis validaciones separarse de la lógica de validación (y mantener la lógica de dominio libre de referencias a cualquier marco de validación) . Sin embargo, necesitan mucho menos código que la alternativa, que está escribiendo una clase de validador personalizada. He aquí un ejemplo:

[ConfigurationElementType(typeof(CustomValidatorData))]
public sealed class RangeValidator : Validator
{
    public RangeValidator(NameValueCollection attributes)
        : base(string.Empty, string.Empty) { }

    protected override string DefaultMessageTemplate
    {
        get { throw new NotImplementedException(); }
    }

    protected override void DoValidate(object objectToValidate,
        object currentTarget, string key, ValidationResults results)
    {
        Range range = (Range)currentTarget;

        if (range.Max < range.Min)
        {
            this.LogValidationResult(results,
                "Max less than min", currentTarget, key);
        }
    }
}

Después de escribir esta clase se puede conectar esta clase en el archivo de configuración de validación de la siguiente manera:

<validation>
  <type name="Range" defaultRuleset="Default" assemblyName="[Range Assembly]">
    <ruleset name="Default">
      <validator type="[Namespace].RangeValidator, [Validator Assembly]"
        name="Range Validator" />
    </ruleset>
  </type>
</validation> 

Segunda pregunta:. ¿Cómo hacer validaciones complejas con interacción posible una base de datos (con VAB)

Los ejemplos que doy a la primera pregunta se pueden utilizar también para esto. Puede utilizar las mismas técnicas de validación: uno mismo y validador personalizado. Su situación en la que desea comprobar un valor en una base de datos es en realidad muy simple, ya que la validez de su objeto no se basa en su contexto. Simplemente puede comprobar el estado del objeto contra la base de datos. Se vuelve más complicado cuando el contexto en el que vive un objeto se pone importante (pero es posible con VAB). Imagínese, por ejemplo, que desea escribir una validación de que se asegura de que todos los clientes, en un momento dado en el tiempo, no tiene más de dos órdenes no enviado. Esto no sólo significa que usted tiene que comprobar la base de datos, pero tal vez los nuevos pedidos que se agregan o se eliminan las órdenes dentro de ese mismo contexto. Este problema no es específico de VAB, tendrá los mismos problemas con cada marco de su elección. He escrito un artículo que describe las complejidades que' re frente a estas situaciones (leer y temblor).

Tercera pregunta: ¿Cómo hacer que la gente en el mundo verdadero negocio con esta situación

que hago este tipo de validación con el VAB en el código de producción. Funciona muy bien, pero VAB no es muy fácil de aprender. Aún así, me encanta lo que podemos hacer con VAB, y sólo va a mejorar cuando v5.0 sale. Cuando se quiere aprender, comenzar con la lectura del documento ValidationHOL.pdf que se puede encontrar en la prácticas de laboratorio descarga.

Espero que esto ayude.

Otros consejos

construyo controles de validación personalizados cuando necesito cualquier cosa que no está incluido fuera de la caja. Lo bueno aquí es que estos validadores personalizados son reutilizables y pueden actuar en múltiples campos. He aquí un ejemplo que he publicado a CodeProject de un validador AtLeastOneOf que le permite exigir que al menos un campo en un grupo tiene un valor:

http://www.codeproject.com/KB/validation/AtLeastOneOfValidator.aspx

El código incluido en la descarga debe trabajar como un fácil seguir el ejemplo de cómo se puede ir sobre ella. La desventaja aquí es que los controles de validación incluyen con ASP.Net no suelen funcionar bien con asp.net-ajax.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top