atributo dependiente de otro campo

En un modelo de mi aplicación ASP.NET MVC, me gustaría validar un cuadro de texto como se requiere solo si se marca una checkbox específica.

Algo como

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

¿Cómo puedo hacer eso?

Gracias.

Eche un vistazo a esto: http://blogs.msdn.com/b/simonince/archive/2010/06/04/conditional-validation-in-mvc.aspx

Modifiqué un poco el código para adaptarlo a mis necesidades. Quizás también te beneficies de esos cambios.

 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 { public RequiredIfValidator(ModelMetadata metadata, ControllerContext context, RequiredIfAttribute attribute) : base(metadata, context, attribute) { } public override IEnumerable GetClientValidationRules() { // no client validation - I might well blog about this soon! return base.GetClientValidationRules(); } public override IEnumerable 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 }; } } } } 

Entonces úsalo:

 public DateTime? DeptDateTime { get; set; } [RequiredIf("DeptDateTime")] public string DeptAirline { get; set; } 

Solo use la biblioteca de validación a prueba de tontos que está disponible en Codeplex: https://foolproof.codeplex.com/

Admite, entre otros, los siguientes atributos / decoraciones de validación “requiredif”:

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

Para empezar es fácil:

  1. Descargue el paquete del enlace provisto
  2. Agregue una referencia al archivo .dll incluido
  3. Importar los archivos javascript incluidos
  4. Asegúrese de que sus puntos de vista hagan referencia a los archivos javascript incluidos desde su HTML para una validación javascript y jquery discreta.

No he visto nada fuera de la caja que te permita hacer esto.

Creé una clase para que la uses, es un poco difícil y definitivamente no es flexible … pero creo que puede resolver tu problema actual. O al menos te pone en el camino correcto.

 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; } } } 

Por encima de tu clase de modelo, solo debes agregar:

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

En tu vista

 <%= Html.ValidationSummary() %> 

Debería mostrar el mensaje de error siempre que la propiedad retirada sea verdadera y la propiedad requerida esté vacía.

Espero que esto ayude.

Utilizando NuGet Package Manager Intstalled esto: https://github.com/jwaliszko/ExpressiveAnnotations

Y esta es mi Modelo:

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

¡Te garantizo que esto funcionará!

Prueba mi atributo de validación personalizado:

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

Es compatible con múltiples condiciones.

Intereting Posts