Я бы создал для этого собственный валидатор - он не даст вам проверку на стороне клиента, только на стороне сервера.
Обратите внимание, что для этого вам нужно будет использовать nullable
типы, так как для типов значений по умолчанию будет 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, по вашему мнению.
Обратите внимание, что вы можете расширить это, чтобы проверить тип возвращаемого свойства, или искать атрибуты в них, чтобы включить / исключить из проверки, если хотите - это предполагает универсальный валидатор, который ничего не знает о типа это проверяет.