👽
3ntr0 Apuntes
  • 📚Principios SOLID y Clean Code
    • 💲Deuda Técnica
    • 📌Mejorar Nombres
      • 📄Nombre según Tipo
      • 🚗Nombre Clases
      • ⚙️Nombres Funciones
    • ☑️Mejorar Funciones
    • ➿Principio DRY
    • 🧼Clean Code en Clases (POO)
      • 📘 Principio de Responsabilidad Única (SRP)
    • 🤮🇸 🇹 🇺 🇵 🇮 🇩 - Code Smells
      • 🚫Singleton
      • 🙏Tight Coupling
      • 🥸U P I D
      • 🚩Más Code Smells
  • 💕Angular
    • 🏍️Standalone
    • 🆚ngClass vs [class.clase]
    • 🩻Directivas
    • 🚩ElementRef
    • 🎀Decoradores
      • @HostListener
    • 🔄OnChanges
    • 🧪Testing - Jasmine y Karma
      • 🚀Módulo 1: Introducción a las pruebas unitarias
      • 🧫Módulo 2: Introducción a Jasmine
      • ⚒️Módulo 3: Introducción a Karma
      • 🔬Módulo 4: Pruebas unitarias en Angular
        • Código comentado Paso a Paso
      • 🕵️‍♂️Módulo 5: Técnicas avanzadas en Jasmine
      • 📚Módulo 6: Técnicas avanzadas en Karma
  • 🖼️HTML y CSS
    • 🖌️Custom Properties
    • Trucos
    • Brakepoints
  • 🧋Javascript
    • 🛠️Funciones
    • 📦Arrays
      • Every y Some
      • Map
      • Reduce
    • 😎Hoisting
    • 🪚Desestructuración
    • 🛻Programación Asincrona
      • 📞Callbacks
      • 🌟Promises
      • 🆚Promise.all Y Promise.any
      • 🚀Async/Await
    • Respuestas HTTP
    • 🧐Dudas Básicas
      • NodeList
      • 🧐Contextos de .this
      • 💭Parametro Rest
      • 🗨️arguments
      • 🙀JavaScript no tiene clases
      • 🆚Null vs Undefined
      • 🔎Operador in
      • 🟨Operador Spread
      • ❓Encadenamiento Opcional
      • 🔲Notación de Corchetes
      • ⛓️Coalescencia Nula (??)
      • 🆚Shallow Copy vs Deep Copy
      • 🆚.json VS JSON.parse
      • ⚙️Fetch wrapper
      • Sets
      • Maps
  • 📒Terminología
    • 💎Esenciales
    • Web
    • Javascript
  • 🌐GIT
    • Source Tree
  • 🧬React
    • 🫂Babel
  • 🔧 Fundamentos de C#
    • 🎛️General
      • 🧐Diferencia Equals y ==
      • 🧐Diferencia entre typeof y .GetType()
      • 📐Convenciones de Nomenclatura
    • 💠Summary
    • 📇.resx
    • 📄Strings
      • ⛓️Comparación de cadenas
    • 🧲Regex
    • 📦POO
      • 🚙Clases
        • ✏️Clase String
        • 📥Métodos de Acceso
        • ⚗️Métodos de Extensión
    • 🖇️Pattern Matching
    • 🚩Excepciones
    • Programación Asíncrona
    • 🔎LINQ
      • 🅿️PLINQ
  • 🌐 Desarrollo Web con ASP.NET
    • 🧬Modelos
      • 🗒️Data Annotations
        • 📑Lista
        • 🧪Atributos
          • 🛠️Atributos Personalizados
          • 🧰AttributeUsage
          • 📥Acceso a los atributos
        • 📚Documentación
    • 👷Servicios
      • ⭐Servicios Singleton
    • ⏳Sesiones
      • 🧭Temp Data
    • DbContext
      • 🔄Eager Loading
    • 🥽Manejo de Datos
      • 🗃️Archivos
        • 📤Subida de Archivos
        • ✏️Leer y Escribir
        • 🕓Manejo de Archivos Temporales
        • 🛡️Validación de Archivos en ASP.NET Core
      • Colecciones
        • 🪜Pila (Stack)
        • 🏇Cola (Queue)
      • 🩻Manejo de XMLs
        • 📂XmlDocument
          • 🎯XPath
        • 🧿XmlReader
    • ❤️Tips y Utilities
      • 🟰StringComparison
    • 🧰Debug Tools
      • 🧭Stopwatch
  • 🚀Razor
    • 🧱Configuración de Proyecto
    • 📃Pages
      • 🔸Método OnGet
      • 🔸Carpeta Models
      • 🔸Partial Pages
    • 🎨Layouts
      • Aplicar CSS A UNA PAGE
    • 🚴‍♂️Routing
    • 🏢_ViewImports
    • ✒️Sintaxis Razor
      • 😀Introducción
      • 📔Expresiones Implícitas
      • 📕Expresiones Explícitas
      • ✍️Renderizar Texto
      • 🧑‍🔬Class Page Model
      • 🔖Tag Helpers
        • 🔹asp-page
        • 🔹asp-append-version
        • 🔹asp-for
        • 🔹asp-items
        • 🔹asp-action y asp-controller
  • 🔮LUA
    • 🎯Fundamentos
    • ⌨️Entrada por Consola
    • 🔗Estructuras de Control
    • ⚒️Funciones
    • 📦Tablas
    • 📚Funciones y Librerías Estándar
    • 🦖POO
Con tecnología de GitBook
En esta página
  1. 🌐 Desarrollo Web con ASP.NET
  2. Modelos
  3. Data Annotations
  4. Atributos

Atributos Personalizados

Para crear un atributo personalizado en .NET, puedes heredar directamente de la clase Attribute o, para validaciones específicas, de la clase ValidationAttribute.

🔹Heredando de Attribute

public class MiAtributo : Attribute
{
    public string Descripcion { get; set; }

    public MiAtributo(string descripcion)
    {
        Descripcion = descripcion;
    }
}

🔹Heredando de ValidationAttribute

public class MiValidacionAtributo : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value is int)
        {
            int valor = (int)value;
            if (valor > 0)
                return ValidationResult.Success;
            else
                return new ValidationResult("El valor debe ser mayor a 0.");
        }
        return new ValidationResult("El tipo de dato no es válido.");
    }
}

El método IsValid sirve para definir la lógica específica que determina si el valor de una propiedad cumple con ciertos criterios de validación.

La clase base ValidationAttribute ofrece dos sobrecargas principales del método IsValid para proporcionar flexibilidad en la implementación de la lógica de validación personalizada. Estas sobrecargas permiten validar un valor de entrada con o sin contexto adicional proporcionado por ValidationContext.

🔹 IsValid(object value)

  • Descripción: Esta sobrecarga toma un único parámetro, value, que representa el valor de la propiedad a validar. El método devuelve un booleano (bool) que indica si el valor es válido (true) o no (false).

  • Uso: Es útil para validaciones simples donde solo necesitas examinar el valor de la propiedad sin necesidad de información adicional sobre el contexto de la propiedad o el objeto al que pertenece.

public override bool IsValid(object value)
{
    int intValue = Convert.ToInt32(value);
    return intValue >= 1 && intValue <= 100; // Ejemplo: Rango válido [1, 100].
}

🔹 IsValid(object value, ValidationContext validationContext)

  • Descripción: Esta sobrecarga proporciona un ValidationContext adicional junto con el valor a validar. ValidationContext ofrece información sobre el contexto específico de la validación, incluido el objeto que contiene el valor a validar, y permite implementar lógicas de validación más complejas que pueden depender de múltiples propiedades del objeto.

  • Uso: Esencial para validaciones complejas donde el resultado puede depender no solo del valor actual sino también de otros valores o propiedades del objeto. Permite devolver un ValidationResult que puede incluir mensajes de error personalizados y los nombres de los miembros específicos que no pasaron la validación.

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    var objetoEvento = validationContext.ObjectInstance as Evento; // Asumiendo una clase 'Evento'.
    if (objetoEvento.FechaInicio > objetoEvento.FechaFin)
    {
        return new ValidationResult("La fecha de inicio no puede ser posterior a la fecha de fin.",
            new[] { nameof(objetoEvento.FechaInicio), nameof(objetoEvento.FechaFin) });
    }
    return ValidationResult.Success;
}

📘 Consideraciones Importantes

  • Elección de Sobrecarga: La elección entre las sobrecargas depende de la complejidad de la validación necesaria. Para reglas simples, IsValid(object value) puede ser suficiente. Para reglas que requieren contexto adicional o que involucran múltiples propiedades del objeto, IsValid(object value, ValidationContext validationContext) es la opción preferida.

  • Devolución de Errores: Mientras que la sobrecarga que devuelve un bool simplemente indica si el valor es válido o no, la sobrecarga que devuelve un ValidationResult permite proporcionar mensajes de error específicos y detallados, lo cual es útil para informar a los usuarios sobre la naturaleza de los errores de validación.

🔹Uso de ValidationResult

ValidationResult se usa comúnmente en la implementación de la lógica de validación personalizada. Cuando heredas de ValidationAttribute para crear una regla de validación personalizada, el método IsValid debe retornar un objeto ValidationResult para indicar si el valor evaluado cumple o no con la regla establecida.

  • Si la validación es exitosa, debes retornar ValidationResult.Success para indicar que no hubo errores.

  • Si la validación falla, debes crear una instancia de ValidationResult proporcionando un mensaje de error y, opcionalmente, los nombres de los miembros que no pasaron la validación.

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    // Supongamos que value es un número y queremos validar que sea positivo
    if (value is int && (int)value > 0)
    {
        // La validación es exitosa
        return ValidationResult.Success;
    }
    else
    {
        // La validación falla, retornamos un nuevo ValidationResult con un mensaje de error
        return new ValidationResult("El valor debe ser un número positivo.");
    }
}
AnteriorAtributosSiguienteAttributeUsage

Última actualización hace 1 año

🧬
🗒️
🧪
🛠️