asp.net-mvc - tutorial - validate model c#
La propiedad obligatoria nulable de la API web requiere el atributo DataMember (3)
Creo que te encuentras con el mismo problema como se discute aquí:
Estoy recibiendo la siguiente máquina virtual en una acción posterior de API web
public class ViewModel
{
public string Name { get; set; }
[Required]
public int? Street { get; set; }
}
Cuando hago una publicación me sale el siguiente error:
La propiedad ''Calle'' en el tipo ''ViewModel'' no es válida. Las propiedades de tipo de valor marcadas como [Requeridas] también deben marcarse con [DataMember (IsRequired = true)] para que se reconozcan según sea necesario. Considere la posibilidad de atribuir el tipo de declaración con [DataContract] y la propiedad con [DataMember (IsRequired = true)].
Parece que el error es claro, así que solo quiero estar completamente seguro de que es necesario usar los atributos [DataContract] y [DataMember] cuando tenga una clase con las propiedades que pueden contener nulos.
¿Hay alguna manera de evitar el uso de estos atributos en la API web?
Esto se soluciona en Web Api 2. Sin embargo, interesante solo funciona si los campos son propiedades con obtener / establecer.
Estoy enfrentando el mismo problema que tú, y creo que es un completo disparate. Con los tipos de valor, puedo ver que [Required]
no funciona ya que una propiedad de tipo de valor no puede ser nula, pero cuando se tiene un tipo de valor anulable no debería haber ningún problema. Sin embargo, la lógica de validación del modelo de la API web parece tratar los tipos de valores que no admiten nulos y que no admiten nulos de la misma manera, por lo que tiene que trabajar alrededor de ellos. Encontré una solución alternativa en el foro de la API web y puedo confirmar que funciona: Cree una subclase ValidationAttribute
y aplíquela en lugar de RequiredAttribute
en las propiedades de tipo de valor que admiten nulos:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
public class NullableRequiredAttribute : ValidationAttribute, IClientValidatable
{
public bool AllowEmptyStrings { get; set; }
public NullableRequiredAttribute()
: base("The {0} field is required.")
{
AllowEmptyStrings = false;
}
public override bool IsValid(object value)
{
if (value == null)
return false;
if (value is string && !this.AllowEmptyStrings)
{
return !string.IsNullOrWhiteSpace(value as string);
}
return true;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var modelClientValidationRule = new ModelClientValidationRequiredRule(FormatErrorMessage(metadata.DisplayName));
yield return modelClientValidationRule;
}
}
NullableRequiredAttribute en uso:
public class Model
{
[NullableRequired]
public int? Id { get; set; }
}