Установить начальное значение для обязательного атрибута - PullRequest
2 голосов
/ 01 августа 2011

Используя аннотации данных, чтобы задать правила проверки для модели, я хочу установить начальное значение для атрибута Required, чтобы оно не работало, если оно равно этому значению.Это была опция в веб-формах, использующих элементы управления валидацией, но я не вижу аналогичных при использовании аннотаций данных.

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

ОБНОВЛЕНИЕ : на основе комментариев / ответовЯ точно знаю, что это не идеальная ситуация, и я должен использовать атрибут placeholder в HTML5.Однако мне нужно сделать это для существующей формы, в которой уже был добавлен теневой текст неидеальным способом.

Ответы [ 4 ]

2 голосов
/ 01 августа 2011

Я бы не справился с этим в MVC, я бы работал над тем, чтобы скрытый текст не публиковался с формой. HTML 5 имеет «заполнитель». Я бы использовал это или реализовал что-то вроде этого: http://davidwalsh.name/html5-placeholder

Проверьте это для простого быстрого подхода к заполнителю, который должным образом ухудшается в браузерах, отличных от HTML5:

Заполнитель JQuery HTML5-симулятор

Просто добавьте атрибут placeholder в ваши текстовые поля и используйте этот javascript, чтобы он работал независимо от версии HTML.

0 голосов
/ 02 августа 2011

Не делайте этого.

Текст заполнителя не значение. Он должен не быть опубликованным.Он должен не быть проверенным.
Это противоречит здравому смыслу, является преступлением против человечества и создает несколько проблем.

  • Что если вам нужнонеобязательное поле номера с текстом заполнителя?
    (проверка не будет выполнена, поскольку заполнитель является строкой.)

  • Что происходит при локализации вашего приложения?
    (Проверка не будет выполнена, пока кто-то не обнаружит, что сравнивается значение этого атрибута.)

  • Проверка должна быть только для сервера, и не будет никакого способа«Серый» текст заполнителя.
    (Если вы не укажете заполнитель еще раз в файле сценария и не будете отслеживать события изменений.)

  • Вы должны будете указать этот «заполнитель» как минимум дважды и в разных местах.
    (Если я вас правильно понял, это один раз в атрибуте и один раз в конструкторе.)

  • Там не будет никакого пути для плацстарше * на самом деле будет значение.
    (Это может произойти, если не для этого поля, то для любого другого, который использует атрибут.)

  • Это будет чертовски ужасно от будущих сопровождающих.
    (Вы даже сомневаетесь в этом?)

Вместо

Используйте placeholder атрибут и унижающие достоинство решения , как предложено Milimetric .

В качестве альтернативы беспокойным DYI-элементам, поместите метку в div и поместите ее над полем ввода с вашим собственным JavaScript.Это известно как метод «overlabel» , и в Интернете есть множество примеров.(Но вам придется тщательно протестировать свое решение в браузерах, которые вы хотите поддерживать.) Вы можете даже развернуть свой собственный специальный HTML-помощник :

@Html.PlaceholderFor(m => m.SomeField)

(я полностью сделалэто зависит от вас, чтобы реализовать это.)

0 голосов
/ 01 августа 2011

Я закончил тем, что создал новый атрибут, который наследуется от RequiredAttribute:

public class RequiredWithInitialValueAttribute : RequiredAttribute
{
    public string InitialValue { get; set; }

    public RequiredWithInitialValueAttribute(string initialValue)
    {
        InitialValue = initialValue;
    }

    public override bool IsValid(object value)
    {
        if (value.ToString().SafeEquals(InitialValue)) return false;
        return base.IsValid(value);
    }
}

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

0 голосов
/ 01 августа 2011

Я не знаю, есть ли какие-либо встроенные аннотации, доступные или не доступные для notequalto , но вы можете создать свой собственный NotEqualAttribute, наследовать ValidationAttribute (для проверки на сервере) и внедрить IClientValidatable ( создать теги data-something, выполнить проверку на клиенте).

Также вы должны написать код в jquery для проверки клиента.

см. Это

Как DataAnnotations действительно работает в MVC?

...