Атрибуты валидации MVC 2 - проверка одного из двух значений - PullRequest
3 голосов
/ 21 июля 2010

Может ли кто-нибудь помочь мне с этим вопросом.Я пытаюсь выяснить, как проверить два значения в форме, один из двух элементов должен быть заполнен. Как выполнить проверку, чтобы убедиться, что один или оба элемента были введены?

Я использую модели представления в ASP.NET MVC 2.

Вот небольшой фрагмент кода:

Представление:

Email: <%=Html.TextBoxFor(x => x.Email)%>
Telephone: <%=Html.TextBoxFor(x => x.TelephoneNumber)%>

Модель представления:

    [Email(ErrorMessage = "Please Enter a Valid Email Address")]
    public string Email { get; set; }

    [DisplayName("Telephone Number")]
    public string TelephoneNumber { get; set; }

Я хочу предоставить любую из этих деталей.

Спасибо за любые указатели.

1 Ответ

5 голосов
/ 21 июля 2010

Вероятно, вы можете сделать это во многом так же, как атрибут 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; }
}

Вы должны иметь возможность добавлять столько, сколько вам нужно, в форме, но если вы хотите, чтобы они вводили значение в одно из более чем двух полей (например, «Электронная почта», «Телефон» или «Факс»), тогда вероятно, лучше всего изменить входные данные на массив значений и проанализировать их таким образом.

...