Атрибут регулярного выражения аннотации проверки Asp.Net MVC

Когда у меня есть флажок в моей форме, недостаточно пометить соответствующее свойство как обязательное, потому что в качестве его значения отправляется значение true или false.

Каков наилучший способ проверить это в модели? Я думал, что регулярное выражение должно соответствовать строке true, но я либо неправильно его пишу, либо оно не работает с логическим свойством.

public bool FeeAgree
    {
        get
        {
            return _feeAgree;
        }
        set
        {
            _feeAgree = value;
        }
    }

Выше приведено свойство, которое я пытаюсь проверить. Использование атрибута Required не работает, поскольку Html.CheckBoxFor создает скрытое поле, поэтому всегда передается значение true или false.


person JBeckton    schedule 02.02.2011    source источник


Ответы (2)


Вам не нужны никакие аннотации данных для логических свойств. Если значение не равно true или false, связыватель модели по умолчанию обработает случай при попытке проанализировать его и добавит ошибку модели. Таким образом, просто из-за наличия такого свойства модели он будет принимать только true или false. Любое другое значение будет считаться ошибкой.

Если бы вы использовали логическое значение, допускающее значение NULL, вы могли бы заставить его иметь значение с атрибутом Required:

[Required]
public bool? FeeAgree { get; set; }

Чтобы убедиться, что пользователь установил флажок, вы можете написать собственный атрибут проверки:

public class MustBeTrueAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        return value != null && (bool)value;
    }
}

а потом:

[MustBeTrue(ErrorMessage = "You must accept the terms and conditions")]
public bool FeeAgree { get; set; }
person Darin Dimitrov    schedule 02.02.2011
comment
В этом проблема, у него всегда есть значение... если значение ложно (это означает, что они не установили флажок), я хочу отправить ошибку обратно. - person JBeckton; 02.02.2011
comment
@JBeckton, хорошо, теперь я понял. Пожалуйста, смотрите мое обновление о пользовательском атрибуте. - person Darin Dimitrov; 02.02.2011

Это решение можно расширить, включив в него проверку на стороне клиента.

public class MustBeTrueAttribute : ValidationAttribute, IClientValidatable {

    public override bool IsValid(object value) {
        return value is bool && (bool)value;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
        ModelMetadata metadata, ControllerContext context) {

        return new ModelClientValidationRule[] {
        new ModelClientValidationRule {
            ValidationType = "checkboxtrue",
            ErrorMessage = this.ErrorMessage
        }};
    }
}

Затем, если представление включало немного кода jquery, чтобы добавить тип проверки "checkboxtrue"...

jQuery.validator.unobtrusive.adapters.add("checkboxtrue", function (options) {
    if (options.element.tagName.toUpperCase() == "INPUT" && options.element.type.toUpperCase() == "CHECKBOX") {
        options.rules["required"] = true;
        if (options.message) {
            options.messages["required"] = options.message;
        }
    }
});

Результатом является проверка флажка на стороне клиента.

person nuander    schedule 24.04.2012