Аннотирования данных для проверки, по крайней мере одного обязательного поля?

Если у меня есть поисковый объект со списком полей, могу я, с помощью Системы. ComponentModel. Пространство имен DataAnnotations, настроенное это для проверки этого по крайней мере одно из полей в поиске, не является пустым или пустым? т.е. Все поля являются дополнительными, но по крайней мере один должен всегда вводиться.

31
задан Justin Johnson 26 April 2010 в 10:07
поделиться

2 ответа

Я бы создал для этого специальный валидатор - он не будет давать вам валидацию на стороне клиента, только на стороне сервера.

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

Обратите внимание, что вы можете расширить это, чтобы проверять тип возвращаемого свойства или искать атрибуты на них, чтобы включить / исключить из проверки, если хотите - это предполагает универсальный валидатор, который ничего не знает о введите это подтверждение.

23
ответ дан 27 November 2019 в 22:25
поделиться

Если вы хотите выполнить сложную проверку для любого класса .Net, не засоряя их аннотациями, посмотрите FluentValidation , или для .Net 2.0, FluentValidation для 2.0

0
ответ дан 27 November 2019 в 22:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: