Если у меня есть поисковый объект со списком полей, могу я, с помощью Системы. ComponentModel. Пространство имен DataAnnotations, настроенное это для проверки этого по крайней мере одно из полей в поиске, не является пустым или пустым? т.е. Все поля являются дополнительными, но по крайней мере один должен всегда вводиться.
Я бы создал для этого специальный валидатор - он не будет давать вам валидацию на стороне клиента, только на стороне сервера.
Обратите внимание, что для этого вам необходимо использовать типы, допускающие значение NULL
, поскольку типы значений по умолчанию будут иметь значение 0
или false
:
Сначала создайте новый валидатор:
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;
}
}
Затем вы можете украсить свои модели следующим образом:
[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; }
}
Затем, когда вы вызовете ModelState.IsValid
, ваш валидатор будет вызван, и ваше сообщение будет добавлено в ValidationSummary на ваш взгляд.
Обратите внимание, что вы можете расширить это, чтобы проверять тип возвращаемого свойства или искать атрибуты на них, чтобы включить / исключить из проверки, если хотите - это предполагает универсальный валидатор, который ничего не знает о введите это подтверждение.
Если вы хотите выполнить сложную проверку для любого класса .Net, не засоряя их аннотациями, посмотрите FluentValidation , или для .Net 2.0, FluentValidation для 2.0