Posteriormente a consultar expertos en este tema, programadores de diversas ramas y maestros dimos con la solución a la cuestión y la plasmamos en este post.
Solución:
Para hacer tu Required
attribute funciona lo que necesita para hacer que el campo sea anulable:
public DateTime? AppointmentDate get; set;
Editar: también tenga en cuenta que DataType
attribute en realidad no realiza la validación en el campo. Fecha de validación de MVC al aplicar el enlace desde post
datos a model
Después de que cambió el sistema de validación de .NET Core 3. Los parámetros que no aceptan valores NULL se tratan como si tuvieran un [Required] attribute. Obtiene la validación del lado del cliente incluso si no aplica el [Required] attribute. La validación JQuery del lado del cliente acepta campos de cadenas vacías, pero una vez enviado al servidor, el mismo campo obtendrá un resultado no válido. The value '' is invalid
es el mensaje de error predeterminado para la validación del lado del servidor. De acuerdo con los documentos de asp.net mediante el uso de un [Required] attribute puede anular este mensaje, pero no se aplica a los campos vacíos. Desafortunadamente, esta característica genera vacío string valores (“”) para campos de entrada ocultos que hacen referencia a propiedades int no anulables (es decir, @Html.Hiddenfor(m=>m.id)
generaría “” para el elemento html). Entonces, de todas las opciones proporcionadas en los documentos de asp.net, la más segura es hacer que la propiedad sea anulable. otra buena opción es cambiar el mensaje predeterminado de .NET a otra cosa
services.AddRazorPages()
.AddMvcOptions(options =>
options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor(
_ => "The field is required.");
);
Puedes leer más sobre esto aquí.
Tiene el mismo problema pero no puede detectar el problema. Revisé el objeto en modo de depuración para ver si hay alguna forma de ver qué propiedad falla en el estado del modelo.
Luego veo el modelo que falla. Ese es un valor booleano que se asigna a una casilla de verificación
¡La parte extraña es “este no es un campo obligatorio”!
Agregué un signo de interrogación y usé el método getvalueordefault cuando lo usé
public bool? IsCorporateAccount get; set;