Вероятно, вы можете сделать это во многом так же, как атрибут PropertiesMustMatch
, который входит в состав веб-приложения File-> New-> ASP.NET MVC 2.
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public sealed class EitherOrAttribute : ValidationAttribute
{
private const string _defaultErrorMessage = "Either '{0}' or '{1}' must have a value.";
private readonly object _typeId = new object();
public EitherOrAttribute(string primaryProperty, string secondaryProperty)
: base(_defaultErrorMessage)
{
PrimaryProperty = primaryProperty;
SecondaryProperty = secondaryProperty;
}
public string PrimaryProperty { get; private set; }
public string SecondaryProperty { get; private set; }
public override object TypeId
{
get
{
return _typeId;
}
}
public override string FormatErrorMessage(string name)
{
return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString,
PrimaryProperty, SecondaryProperty);
}
public override bool IsValid(object value)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
object primaryValue = properties.Find(PrimaryProperty, true /* ignoreCase */).GetValue(value);
object secondaryValue = properties.Find(SecondaryProperty, true /* ignoreCase */).GetValue(value);
return primaryValue != null || secondaryValue != null;
}
}
Ключевой частью этой функции является функция IsValid, которая определяет, имеет ли значение один из двух параметров.
В отличие от обычных атрибутов на основе свойств, он применяется к уровню класса и может использоваться следующим образом:
[EitherOr("Email", "TelephoneNumber")]
public class ExampleViewModel
{
[Email(ErrorMessage = "Please Enter a Valid Email Address")]
public string Email { get; set; }
[DisplayName("Telephone Number")]
public string TelephoneNumber { get; set; }
}
Вы должны иметь возможность добавлять столько, сколько вам нужно, в форме, но если вы хотите, чтобы они вводили значение в одно из более чем двух полей (например, «Электронная почта», «Телефон» или «Факс»), тогда вероятно, лучше всего изменить входные данные на массив значений и проанализировать их таким образом.