Si tengo un objeto de búsqueda con una lista de campos, ¿puedo, mediante el espacio de nombres System.ComponentModel.DataAnnotaciones, configurarlo para validar que al menos uno de los campos en la búsqueda no es nulo o está vacío? Es decir, todos los campos son opcionales, pero al menos uno siempre debe ingresarse.Anotaciones de datos para la validación, ¿al menos un campo obligatorio?
Respuesta
que crearía un validador personalizado para esto - que ganaron No le damos validación del lado del cliente, solo del lado del servidor.
Tenga en cuenta que para que esto funcione, usted necesita utilizar nullable
tipos, como los tipos de valor por defecto se 0
o false
:
En primer lugar crear un nuevo validador:
using System.ComponentModel.DataAnnotations;
using System.Reflection;
// This is a class-level attribute, doesn't make sense at the property level
[AttributeUsage(AttributeTargets.Class)]
public class AtLeastOnePropertyAttribute : ValidationAttribute
{
// Have to override IsValid
public override bool IsValid(object value)
{
// Need to use reflection to get properties of "value"...
var typeInfo = value.GetType();
var propertyInfo = typeInfo.GetProperties();
foreach (var property in propertyInfo)
{
if (null != property.GetValue(value, null))
{
// We've found a property with a value
return true;
}
}
// All properties were null.
return false;
}
}
Puede luego decorar sus modelos con esto:
[AtLeastOneProperty(ErrorMessage="You must supply at least one value")]
public class SimpleTest
{
public string StringProp { get; set; }
public int? Id { get; set; }
public bool? BoolProp { get; set; }
}
luego, cuando se llama a ModelState.IsValid
su validador b e llamado, y su mensaje se agregará al ValidationSummary en su vista.
Tenga en cuenta que puede ampliar esto para verificar el tipo de propiedad que se devuelve, o buscar los atributos en ellos para incluir/excluir de la validación si así lo desea; esto es asumiendo un validador genérico que no sabe nada sobre el tipo que está validando
Si usted quiere hacer la validación compleja contra cualquier clase de .NET, sin LiteRing con anotaciones, mira FluentValidation, o para .Net 2.0, FluentValidation for 2.0
Daniel, gracias por la respuesta, pero como hemos estado utilizando las anotaciones con éxito hasta ahora en el proyecto y que ha sido muy bueno para lo que hemos necesitado, quiero tratar de apegarse a este método de validación Este es el primer obstáculo real hasta ahora y espero que alguien pueda tener una buena solución para mí. :) – Boob
Sin preocupaciones. Cuando tengas tiempo, mira los enlaces. Encontrará que el enfoque Fluent es intuitivo y fácil de usar. Y muy poderoso. –
Lo haré, gracias de nuevo – Boob
He extendido la respuesta de Zhaph para admitir la agrupación de propiedades.
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class AtLeastOnePropertyAttribute : ValidationAttribute
{
private string[] PropertyList { get; set; }
public AtLeastOnePropertyAttribute(params string[] propertyList)
{
this.PropertyList = propertyList;
}
//See http://stackoverflow.com/a/1365669
public override object TypeId
{
get
{
return this;
}
}
public override bool IsValid(object value)
{
PropertyInfo propertyInfo;
foreach (string propertyName in PropertyList)
{
propertyInfo = value.GetType().GetProperty(propertyName);
if (propertyInfo != null && propertyInfo.GetValue(value, null) != null)
{
return true;
}
}
return false;
}
}
Uso:
[AtLeastOneProperty("StringProp", "Id", "BoolProp", ErrorMessage="You must supply at least one value")]
public class SimpleTest
{
public string StringProp { get; set; }
public int? Id { get; set; }
public bool? BoolProp { get; set; }
}
Y si usted quiere tener 2 grupos (o más):
[AtLeastOneProperty("StringProp", "Id", ErrorMessage="You must supply at least one value")]
[AtLeastOneProperty("BoolProp", "BoolPropNew", ErrorMessage="You must supply at least one value")]
public class SimpleTest
{
public string StringProp { get; set; }
public int? Id { get; set; }
public bool? BoolProp { get; set; }
public bool? BoolPropNew { get; set; }
}
Esto es genial, gracias. Vale la pena decir que una validación de nivel de clase como esta solo se activa (es decir, se llama IsValid()) cuando todas las validaciones de nivel de propiedad se procesan correctamente. – VictorySaber
Gran código, funciona muy bien. Gracias ! – Jacob
Esta pregunta es bastante viejo, pero a partir de .NET 3.5 (I creer), IValidatableObject puede ayudar con situaciones de validación difíciles. Puede implementarlo para validar reglas comerciales arbitrarias. En este caso, algo así como:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (string.IsNullOrWhiteSpace(FieldOne) && string.IsNullOrWhiteSpace(FieldTwo))
yield return new ValidationResult("Must provide value for either FieldOne or FieldTwo.", new string[] { "FieldOne", "FieldTwo" });
}
- 1. Localize mensajes por defecto anotaciones de datos ([Obligatorio] [StringLength] etc.)
- 2. Anotación de validación de hibernación: valide que al menos un campo no sea nulo
- 3. campo obligatorio dentro de un acordeón jquery
- 4. Validación fluida vs. anotaciones de datos
- 5. Orden de validación al usar anotaciones y atributos personalizados
- 6. campo Fecha que da un error en la validación requerida
- 7. mejor (o al menos buena) guía de anotaciones Java
- 8. ASP.NET Validación de anotaciones de datos de MVC ErrorMessageResourceType
- 9. Indicador de campo obligatorio ASP.NET MVC
- 10. ¿Las anotaciones de datos realmente son una buena idea para la validación?
- 11. Asp.Net Mvc Campo oculto de anotaciones de datos
- 12. Enlace al campo doble con validación
- 13. ¿Cómo funcionan las anotaciones de datos?
- 14. Rieles: cómo requerir que al menos un campo no esté en blanco
- 15. ASP.NET MVC: ¿Es suficiente la validación de anotación de datos?
- 16. asp.net mvc TextAreaFor no está siendo validado como un campo obligatorio
- 17. asp.net validador de campo requerido para al menos un cuadro de texto contiene texto
- 18. EF. error de validación requerida para campos de cadena elevar sin [Obligatorio] atributo
- 19. agregar anotaciones de datos programáticamente
- 20. ArgumentError: Debe suministrar al menos una validación con: si
- 21. ¿Cómo marcar un método obligatorio?
- 22. Validador de campo obligatorio que no se activa
- 23. Validación de campo de un solo botón
- 24. Uso de anotaciones de datos en POCO con MVC para validación remota
- 25. marco de validación basado en anotaciones
- 26. editEl campo de texto es obligatorio antes de pasar a otra actividad
- 27. Desactivar validación de entrada para un solo campo
- 28. ¿Cuál es la mejor manera de resaltar un campo obligatorio en un formulario web?
- 29. mensajes de error de validación del modelo de datos usando anotaciones
- 30. Expresión regular para la validación del campo de dirección
+1 Agradable. No sabía que era posible agregar atributos de nivel de clase con DataAnnotations. – Steven
Esto se ve muy bien, volveré a esto antes de que finalice la semana y daré una respuesta a tu respuesta. ¡Te dejaré saber cómo resulta! gracias – Boob
@Boob Eres un mentiroso. – JefClaes