У меня есть модель представления как это:
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, то он не будет работать, потому что компилятор кричит
"Шаблоны могут использоваться только с доступом к полю, доступом свойства, индексом массива единственного размера или единственным параметром пользовательские выражения индексатора".
Так, что корректный путь состоит в том, чтобы обработать это?
Я получил это, создав настраиваемый атрибут:
public class BooleanRequiredAttribute : RequiredAttribute
{
public override bool IsValid(object value)
{
return value != null && (bool) value;
}
}
Мое решение - это простой настраиваемый атрибут для логических значений:
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; }
«Требуется» здесь неверная проверка. Вы хотите что-то вроде «Должно иметь значение истина», что не то же самое, что «Обязательно». А как насчет использования чего-то вроде:
[RegularExpression("^true")]
?
Мое решение выглядит следующим образом (оно не сильно отличается от уже отправленных ответов, но я считаю, что оно названо лучше):
/// <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; }