Модель MVC требует истинного - PullRequest
72 голосов
/ 19 января 2011

Есть ли способ аннотации данных требовать, чтобы булево свойство было установлено в true?

public class MyAwesomeObj{
    public bool ThisMustBeTrue{get;set;}
}

Ответы [ 16 ]

2 голосов
/ 10 октября 2011

У вас есть соответствующие элементы, настроенные в web.config ?

, которые могут привести к тому, что проверка не будет работать.

Вы также можете попытаться создатьпользовательский атрибут проверки (поскольку [Required] заботится только о том, существует он или нет, а вы заботитесь о его значении):

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
sealed public class RequiredTrueAttribute : ValidationAttribute
{
    // Internal field to hold the mask value.
    readonly bool accepted;

    public bool Accepted
    {
        get { return accepted; }
    }

    public RequiredTrueAttribute(bool accepted)
    {
        this.accepted = accepted;
    }

    public override bool IsValid(object value)
    {
        bool isAccepted = (bool)value;
        return (isAccepted == true);
    }

    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentCulture,
          ErrorMessageString, name, this.Accepted);
    }
}

Затем, использование:

[RequiredTrue(ErrorMessage="{0} requires acceptance to continue.")]
public bool Agreement {get; set;}

С здесь .

1 голос
/ 12 мая 2017

Вот что у меня сработало.Больше ничего не делал.Mvc 5:

Модель

public string True
{
  get
  {
    return "true";
  }
}

[Required]
[Compare("True", ErrorMessage = "Please agree to the Acknowlegement")]
public bool Acknowlegement { get; set; }

Вид

  @Html.HiddenFor(m => m.True)
  @Html.EditorFor(model => model.Acknowlegement, new { htmlAttributes = Model.Attributes })
  @Html.ValidationMessageFor(model => model.Acknowlegement, "", new { @class = "text-danger" })

enter image description here

enter image description here

1 голос
/ 19 января 2011

Я не знаю, как пройти через аннотации данных, но это легко сделать в вашем контроллере.

public ActionResult Add(Domain.Something model)
{

    if (!model.MyCheckBox)
        ModelState.AddModelError("MyCheckBox", "You forgot to click accept");

    if (ModelState.IsValid) {
        //'# do your stuff
    }

}

Единственным другим вариантом будет создание пользовательского валидатора для стороны сервера и удаленного валидатора для стороны клиента (удаленная валидация доступна только в MVC3 +)

0 голосов
/ 13 апреля 2015

Проверьте правильность проверки здесь .Вы можете скачать / установить его через Nuget.

Это отличная небольшая библиотека для такого рода вещей.

0 голосов
/ 31 декабря 2014
/// <summary> 
///  Summary : -CheckBox for or input type check required validation is not working the root cause and solution as follows
///
///  Problem :
///  The key to this problem lies in interpretation of jQuery validation 'required' rule. I digged a little and find a specific code inside a jquery.validate.unobtrusive.js file:
///  adapters.add("required", function (options) {
///  if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
///    setValidationValues(options, "required", true);
///    }
///   });
///   
///  Fix: (Jquery script fix at page level added in to check box required area)
///  jQuery.validator.unobtrusive.adapters.add("brequired", 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;
///                       }
///  Fix : (C# Code for MVC validation)
///  You can see it inherits from common RequiredAttribute. Moreover it implements IClientValidateable. This is to make assure that rule will be propagated to client side (jQuery validation) as well.
///  
///  Annotation example :
///   [BooleanRequired]
///   public bool iAgree { get; set' }
/// </summary>


public class BooleanRequired : RequiredAttribute, IClientValidatable
{

    public BooleanRequired()
    {
    }

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

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        return new ModelClientValidationRule[] { new ModelClientValidationRule() { ValidationType = "brequired", ErrorMessage = this.ErrorMessage } };
    }
}
0 голосов
/ 10 октября 2011

Я думаю, что лучший способ справиться с этим - просто проверить в своем контроллере, если поле имеет значение true, иначе просто добавьте ошибку в вашу модель и заставьте ее снова отобразить ваш взгляд.

Как указывалось ранее, все [Обязательные] должны убедиться, что есть значение, и в вашем случае, если не проверено, вы все равно получите false.

...