es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se encontró el método de Base Estática (Fallo de código de Extensión de Validación del Modelo).

Error en la extensión de validación del modelo

Hola a todos,

Quería crear un método base estático en lugar de escribir un Método de Validación por separado para cada modelo, pero no sucedió.

¿Hay alguna manera? ¿O es necesario intentar otro método?

Controlador

    [HttpPost]
    public IActionResult SaveMember(MemberPostModel postedMember)
    {
        if (postedMember.Validate()) return null;
        // otras líneas de código...
    }

Modelo

public class MemberPostModel : PostModelBase<MemberPostModel>, IDto
{
    public int Id { get; set; }

    // otras propiedades...
}

Modelo de Base para Validación

public static class PostModelBase<TPostModel> where TPostModel : IDto
{
    public static bool Validate(this TPostModel postModel)
    {
        foreach (var prop in postModel.GetType().GetProperties())
        {
            if (prop.PropertyType == typeof(string))
            {
                var length = prop.GetValue(postModel)?.ToString().Length.ToInt32();
                var attr = prop.GetPropertyCustomAttribute<StringLengthAttribute>();
                if (attr == null) continue;
                if (attr.MaximumLength == length) continue;
                else return false;
            }
        }
        return true;
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código de la Extensión de Validación de Modelo proporcionado es que no maneja correctamente el caso en el que la longitud de la propiedad de cadena es menor que la longitud mínima especificada en el Atributo de Longitud de Cadena (StringLengthAttribute). El método de extensión sólo comprueba cuando la longitud de la propiedad es igual a la longitud máxima especificada en el atributo.

    Para resolver este problema, el método Validate en la clase PostModelBase puede ser modificado para verificar tanto las restricciones de longitud mínima como máxima utilizando el atributo de Longitud de Cadena (StringLengthAttribute). A continuación se muestra una versión actualizada del método Validate:

    public static bool Validate(this TPostModel postModel)
    {
        foreach (var prop in postModel.GetType().GetProperties())
        {
            if (prop.PropertyType == typeof(string))
            {
                var value = prop.GetValue(postModel) as string;
                if (value == null) continue;
    
                var attr = prop.GetCustomAttribute<stringlengthattribute>();
                if (attr == null) continue;
    
                if (value.Length < attr.MinimumLength || value.Length > attr.MaximumLength)
                {
                    return false;
                }
            }
        }
    
        return true;
    }
    

    Con este cambio, el método Validate manejará adecuadamente tanto las restricciones de longitud mínima como máxima especificadas en el atributo de Longitud de Cadena (StringLengthAttribute).

Comments are closed.