Validación personalizada con anotaciones de datos.

asp.net-mvc data-annotations entity-framework

Pregunta

Estoy usando anotaciones de datos para verificar los datos que se están ingresando, pero estoy atascado cuando se trata de una forma más personalizada de validar los datos.

Necesito ejecutar consultas en la base de datos para ver si hay cosas allí o no, y luego informar al usuario si aparece un "error de comprobación de db personalizado", como "El nombre de la compañía ya existe"

¿Cómo puedo implementar tal cosa junto con las anotaciones de datos?

Tengo todas las consultas realizadas, etc. usando linq y el marco de la entidad que viene con 3.5sp1

/METRO

Respuesta aceptada

Atributos personalizados que amplían las anotaciones de datos.

Tendrá que escribir sus propios atributos que harán la validación de su instancia de objeto contra el almacén de datos.

Asegúrese de que sus clases heredan la clase System.ComponentModel.DataAnnotations.ValidationAttribute :

public class MustNotExist: ValidationAttribute
{
    ...
}

Precaución

Me he encontrado con una situación similar cuando necesitaba validar que el objeto es único dentro del almacén de datos. Pero este tipo de validación no fue posible en la clase de entidad en sí, ya que solo debería funcionar para aquellas entidades que se están creando, pero no cuando ya devuelve su entidad desde el almacén de datos.

Mi solución era tener una interfaz, clase y atributo separados.

public interface IExternalValidator ...

class DBUniqueValidator: IExternalValidator ...

class ValidateExternallyAttribute: FilterAttribute, IActionFilter
{
    ...
    public ValidateExternallyAttribute(Type validatorType, Type entityType) ...
    ...
}

Pude colocar mi atributo en acciones de controlador que obtienen parámetros de entidad. El atributo de acción del filtro luego verifica los parámetros de acción del controlador (puede acceder fácilmente a sus tipos y valores) y ejecuta un validador externo con los parámetros correctos (tipos proporcionados en la definición de atributo) y completa los errores de ModelState cuando falla la validación.

[ValidateExternally(typeof(DBUniqueValidator), typeof(User))]
public ActionResult RegisterUser(User newUser)
{
    if (!this.ModelState.IsValid)
    {
        // act accordingly - probably return some error depending on model state errors
    }
    // register new user in data store
}

De esta manera, pude ejecutar la validación externa solo en aquellas acciones que realmente lo necesitaban, y esta técnica también ayudó a que el código de las acciones de mi controlador se mantuviera limpio y corto. Todo lo que tenía que hacer es comprobar si hay algún error de estado de modelo.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué