tag route parameter page net data asp all asp.net-mvc validation data-annotations

asp.net-mvc - route - tag helpers asp net core



AnotaciĆ³n de datos condicional (3)

En el Controlador puede verificar esto: Antes si (ModelState.IsValid)

if (model.party_type == ''p'') { this.ModelState.Remove("surname"); }

¿Hay alguna manera de hacer una anotación de datos condicional? Tengo una Party mesa donde almaceno organizaciones y personas. Si estoy agregando una organización, no quiero que el apellido de campo sea obligatorio, pero solo si estoy agregando una persona.

public class Party { [Required(ErrorMessage = "{0} is missing")] [DisplayName("Your surname")] public object surname { get; set; } [DisplayName("Type")] public object party_type { get; set; } ... }

Me gustaría una condición para la anotación de datos requerida del apellido, algo como:
if (party_type==''P'') entonces se requiere el apellido, de lo contrario el apellido puede estar vacío.

EDITAR
Si tengo que mover esta validación al controlador, ¿cómo lo haría allí? ¿Cómo puedo activar el mismo mensaje de error desde allí?


Puede hacer que su modelo se herede de IValidatableObject y luego poner su lógica personalizada en el método Validar. Tendrá que eliminar el atributo RequredAttribute de la propiedad también. Deberá escribir algún javascript personalizado para validar esta regla en el cliente, ya que el método Validar no se traduce en el marco de validación discreto. Tenga en cuenta que cambié sus propiedades a cadenas para evitar el lanzamiento.

Además, si tiene otros errores de validación de los atributos, estos se activarán primero e impedirán que se ejecute el método Validar, por lo que solo detectará estos errores si la validación basada en atributos es correcta.

public class Party : IValidatableObject { [DisplayName("Your surname")] public string surname { get; set; } [DisplayName("Type")] public string party_type { get; set; } ... public IEnumerable<ValidationResult> Validate( ValidationContext context ) { if (party_type == "P" && string.IsNullOrWhitespace(surname)) { yield return new ValidationResult("Surname is required unless the party is for an organization" ); } } }

En el cliente puedes hacer algo como:

<script type="text/javascript"> $(function() { var validator = $(''form'').validate(); validator.rules(''add'', { ''surname'': { required: { depends: function(element) { return $(''[name=party_type]'').val() == ''P''; } }, messages: { required: ''Surname is required unless the party is for an organization.'' } } }); }); </script>


Sé que este tema tiene algo de tiempo, pero si le gustaría usar solo una validación declarativa para eso, podría usar una construcción tan simple (vea esta referencia para más posibilidades):

[RequiredIf(DependentProperty = "party_type", TargetValue = "P")] public string surname { get; set; } public string party_type { get; set; }

Actualizar:

Desde el ExpressiveAnnotations 2.0, hay un cambio de ruptura. Ahora lo mismo se puede hacer de una manera más simple:

[RequiredIf("party_type == ''P''")] public string surname { get; set; }