attribut dépendant d'un autre champ

dans un modèle de mon ASP.NET application MVC je voudrais valider une zone de texte comme requis seulement si une zone de contrôle spécifique est cochée.

quelque Chose comme

public bool retired {get, set};

[RequiredIf("retired",true)]
public string retirementAge {get, set};

Comment puis-je le faire?

je vous Remercie.

24
demandé sur Castrohenge 2010-09-15 02:07:16

5 réponses

jetez un coup d'oeil à ceci: http://blogs.msdn.com/b/simonince/archive/2010/06/04/conditional-validation-in-mvc.aspx

j'ai modulé le code un peu pour répondre à mes besoins. Peut-être bénéficiez-vous aussi de ces changements.

public class RequiredIfAttribute : ValidationAttribute
{
    private RequiredAttribute innerAttribute = new RequiredAttribute();
    public string DependentUpon { get; set; }
    public object Value { get; set; }

    public RequiredIfAttribute(string dependentUpon, object value)
    {
        this.DependentUpon = dependentUpon;
        this.Value = value;
    }

    public RequiredIfAttribute(string dependentUpon)
    {
        this.DependentUpon = dependentUpon;
        this.Value = null;
    }

    public override bool IsValid(object value)
    {
        return innerAttribute.IsValid(value);
    }
}

public class RequiredIfValidator : DataAnnotationsModelValidator<RequiredIfAttribute>
{
    public RequiredIfValidator(ModelMetadata metadata, ControllerContext context, RequiredIfAttribute attribute)
        : base(metadata, context, attribute)
    { }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        // no client validation - I might well blog about this soon!
        return base.GetClientValidationRules();
    }

    public override IEnumerable<ModelValidationResult> Validate(object container)
    {
        // get a reference to the property this validation depends upon
        var field = Metadata.ContainerType.GetProperty(Attribute.DependentUpon);

        if (field != null)
        {
            // get the value of the dependent property
            var value = field.GetValue(container, null);

            // compare the value against the target value
            if ((value != null && Attribute.Value == null) || (value != null && value.Equals(Attribute.Value)))
            {
                // match => means we should try validating this field
                if (!Attribute.IsValid(Metadata.Model))
                    // validation failed - return an error
                    yield return new ModelValidationResult { Message = ErrorMessage };
            }
        }
    }
}

Puis l'utiliser:

public DateTime? DeptDateTime { get; set; }
[RequiredIf("DeptDateTime")]
public string DeptAirline { get; set; }
14
répondu RickardN 2011-02-22 14:46:51

il suffit D'utiliser la bibliothèque de validation infaillible qui est disponible sur Codeplex: https://foolproof.codeplex.com/

Il soutient, entre autres, les suivants "requiredif" attributs de validation / décorations:

[RequiredIf]
[RequiredIfNot]
[RequiredIfTrue]
[RequiredIfFalse]
[RequiredIfEmpty]
[RequiredIfNotEmpty]
[RequiredIfRegExMatch]
[RequiredIfNotRegExMatch]

Pour commencer, c'est simple:

  1. télécharger le paquet à partir du lien fourni
  2. Ajouter une référence à la inclus .fichier dll
  3. Importer le javascript inclus les fichiers
  4. assurez-vous que vos vues font référence aux fichiers javascript inclus dans son HTML pour une validation javascript et jquery discrète.
10
répondu Sir Juice 2014-02-18 14:59:56

Je n'ai rien vu hors de la boîte qui vous permettrait de faire cela.

j'ai créé une classe pour vous à utiliser, c'est un peu rude et certainement pas flexible.. mais je pense que ça pourrait résoudre votre problème actuel. Ou au moins te mettre sur la bonne voie.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Globalization;

namespace System.ComponentModel.DataAnnotations
{
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
    public sealed class RequiredIfAttribute : ValidationAttribute
    {
        private const string _defaultErrorMessage = "'{0}' is required";
        private readonly object _typeId = new object();

        private string  _requiredProperty;
        private string  _targetProperty;
        private bool    _targetPropertyCondition;

        public RequiredIfAttribute(string requiredProperty, string targetProperty, bool targetPropertyCondition)
            : base(_defaultErrorMessage)
        {
            this._requiredProperty          = requiredProperty;
            this._targetProperty            = targetProperty;
            this._targetPropertyCondition   = targetPropertyCondition;
        }

        public override object TypeId
        {
            get
            {
                return _typeId;
            }
        }

        public override string FormatErrorMessage(string name)
        {
            return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, _requiredProperty, _targetProperty, _targetPropertyCondition);
        }

        public override bool IsValid(object value)
        {
            bool result             = false;
            bool propertyRequired   = false; // Flag to check if the required property is required.

            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
            string requiredPropertyValue            = (string) properties.Find(_requiredProperty, true).GetValue(value);
            bool targetPropertyValue                = (bool) properties.Find(_targetProperty, true).GetValue(value);

            if (targetPropertyValue == _targetPropertyCondition)
            {
                propertyRequired = true;
            }

            if (propertyRequired)
            {
                //check the required property value is not null
                if (requiredPropertyValue != null)
                {
                    result = true;
                }
            }
            else
            {
                //property is not required
                result = true;
            }

            return result;
        }
    }
}

au-dessus de votre classe Model, vous devriez juste avoir besoin d'ajouter:

[RequiredIf("retirementAge", "retired", true)]
public class MyModel

Dans votre Vue.

<%= Html.ValidationSummary() %> 

devrait montrer le message d'erreur chaque fois que la propriété retirée est vraie et le propriété est vide.

Espérons que cette aide.

3
répondu Zack 2010-09-16 10:03:42

à l'Aide du Gestionnaire de Package NuGet j'ai installé ceci: https://github.com/jwaliszko/ExpressiveAnnotations

Et voici mon modèle:

using ExpressiveAnnotations.Attributes;

public bool HasReferenceToNotIncludedFile { get; set; }

[RequiredIf("HasReferenceToNotIncludedFile == true", ErrorMessage = "RelevantAuditOpinionNumbers are required.")]
public string RelevantAuditOpinionNumbers { get; set; }

je vous garantis que cela va fonctionner!

3
répondu Tony_KiloPapaMikeGolf 2018-01-25 12:08:14

essaye de faire de mon custom attribut de validation:

[ConditionalRequired("retired==true")]
public string retirementAge {get, set};

il supporte plusieurs conditions.

0
répondu karaxuna 2013-11-16 13:52:51