Pregunta

Actualización de ModelState

Hola, tengo una pregunta sobre ModelState en un controlador ASP.NET MVC.

Cuando el usuario selecciona una determinada opción de la vista, la fecha de inicio y la fecha de finalización de la "certificación" se establecerá en función de las otras fechas ingresadas.

El problema con esto es que las fechas de certificación vuelven a ser nulas y nuestra clase CertificationMetaData especifica los campos como [Requerido], por lo que ModelState no es válido en cuanto se carga la acción.

Eliminar los errores de ModelSate manualmente permite que esto funcione, pero me preguntaba si hay una mejor manera de hacerlo. ¿Hay alguna manera de actualizar ModelState? ¿Debo hacer que los campos no sean obligatorios? ¿O debo agregar un valor de fecha desde la vista con javascript?

public ActionResult Create(FormCollection fc, Certification certification, Absence absence)
{
    if (certification.CertificationTypeID == 1)
    {
        certification.CertificationStartDate = absence.StartDate;
        certification.CertificationEndDate = absence.StartDate.AddDays(7);
        this.ModelState.Remove("CertificationStartDate");
        this.ModelState.Remove("CertificationEndDate");
    }

    if (this.ModelState.IsValid)
    {
        // save
        return RedirectToAction("Index");
    }
     return View();
}

Además, como puede ver, he codificado el valor de ID para el tipo de certificación. ¿Cuál es la mejor manera de comparar valores con los valores de la tabla de búsqueda? ¿Es una enumeración la mejor manera de hacerlo?

Gracias

¿Fue útil?

Solución

Obviamente, esto es algo personal, pero no eliminaría los mensajes de error.

Si iba por la solución simple, eliminaría el atributo [Obligatorio] y agregaría un código de validación al controlador para agregar el error si faltaban las fechas o establecerlo en el valor alternativo si era el tipo correcto.

Si fuera por la solución más compleja, pondría la validación a nivel de Modelo. Posiblemente una clase base o interfaz que el modelo debe implementar. Una clase ValidationHelper con un método Validate estático (objeto IValidate) que inspeccionará ValidationAttributes y llama a un método Validate en el Modelo. Luego devolvería una colección de ValidationErrors. Luego, se escribiría un ModelBinder personalizado que comprende la validación del Modelo y los asigna a los errores de ModelState.

Otros consejos

El siguiente enfoque actualiza el estado del modelo y le permite mantener el diseño de su modelo coherente con los atributos [necesarios], etc.

En mi caso, quiero que mi modelo tenga un campo obligatorio que los usuarios de nivel normal que usan una API no pueden cambiar, así que hice esto:

ModelState.Remove("ChangeDate");
ModelState.Add("ChangeDate", new ModelState());
ModelState.SetModelValue("ChangeDate", new ValueProviderResult(club.ChangeDate, DateTime.Now.ToString(), null));

De esa manera, no necesita eliminar los campos obligatorios, y tampoco necesita proporcionar una fecha en javascript.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top