Как обработать булевские переменные/Флажки в ASP.NET MVC 2 с DataAnnotations?

У меня есть модель представления как это:

public class SignUpViewModel
{
    [Required(ErrorMessage = "Bitte lesen und akzeptieren Sie die AGB.")]
    [DisplayName("Ich habe die AGB gelesen und akzeptiere diese.")]
    public bool AgreesWithTerms { get; set; }
}

Код разметки представления:

<%= Html.CheckBoxFor(m => m.AgreesWithTerms) %>
<%= Html.LabelFor(m => m.AgreesWithTerms)%>

Результат:

Никакая проверка не выполняется. Это хорошо до сих пор, потому что bool является типом значения и никогда пустым указателем. Но даже если я сделаю AgreesWithTerms nullable, то он не будет работать, потому что компилятор кричит

"Шаблоны могут использоваться только с доступом к полю, доступом свойства, индексом массива единственного размера или единственным параметром пользовательские выражения индексатора".

Так, что корректный путь состоит в том, чтобы обработать это?

47
задан asp_net 11 February 2010 в 14:47
поделиться

4 ответа

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

public class BooleanRequiredAttribute : RequiredAttribute 
{
    public override bool IsValid(object value)
    {
        return value != null && (bool) value;
    }
}
18
ответ дан 26 November 2019 в 19:10
поделиться

Мое решение - это простой настраиваемый атрибут для логических значений:

public class BooleanAttribute : ValidationAttribute
{
    public bool Value
    {
        get;
        set;
    }

    public override bool IsValid(object value)
    {
        return value != null && value is bool && (bool)value == Value;
    }
}

Затем вы можете использовать его в своей модели следующим образом:

[Required]
[Boolean(Value = true, ErrorMessage = "You must accept the terms and conditions")]
[DisplayName("Accept terms and conditions")]
public bool AcceptsTerms { get; set; }
3
ответ дан 26 November 2019 в 19:10
поделиться

«Требуется» здесь неверная проверка. Вы хотите что-то вроде «Должно иметь значение истина», что не то же самое, что «Обязательно». А как насчет использования чего-то вроде:

[RegularExpression("^true")]

?

4
ответ дан 26 November 2019 в 19:10
поделиться

Мое решение выглядит следующим образом (оно не сильно отличается от уже отправленных ответов, но я считаю, что оно названо лучше):

/// <summary>
/// Validation attribute that demands that a boolean value must be true.
/// </summary>
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class MustBeTrueAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        return value != null && value is bool && (bool)value;
    }
}

Тогда вы можете использовать его например, в вашей модели:

[MustBeTrue(ErrorMessage = "You must accept the terms and conditions")]
[DisplayName("Accept terms and conditions")]
public bool AcceptsTerms { get; set; }
91
ответ дан 26 November 2019 в 19:10
поделиться
Другие вопросы по тегам:

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