¿Qué significa para una propiedad ser y anulable?

¿Qué significa para una propiedad ser [Required] y anulable? (ejemplo a continuación) Parece que si es [Required] no podría ser null (ningún valor), y si puede ser null , posiblemente no sea [Required] .

 [Required] public DateTime? OrderDate { get; set; } 

El motivo por el cual una propiedad puede contener nulos y marcarse con el atributo [Required] es para protegerse contra los ataques que no se publican con la debida antelación. También le permite mostrar un valor inicial vacío en la vista en lugar del valor predeterminado para la propiedad. Esto se hace típicamente con propiedades de tipo de valor en modelos de vista.

Un ataque de baja publicación es cuando un usuario malintencionado modifica la solicitud para omitir un valor para la propiedad en la solicitud. Si la propiedad era DateTime (no anulable), DefaultModelBinder inicializará el valor predeterminado ( 01/01/0001 ) y no se ModelState ningún error de ModelState . Como resultado, ese valor se puede guardar aunque no sea lo que se espera.

Si la propiedad es DateTime? (nullable) y [Required] , luego si un usuario malicioso omitió la propiedad en la solicitud, se ModelState un error ModelState porque se espera un valor en la solicitud, y la vista se devolverá, por lo tanto, los datos no válidos no se generarán. ser salvado.

Consulte también el artículo de Brad Wilson Validación de entrada vs. Validación de modelo en ASP.NET MVC y la sección titulada El problema de “baja contabilización” .

Es anulable, por lo que el formulario no muestra un valor inicial como 0001-01-01T00:00:00 que no tiene ningún significado.

Se requiere forzar al usuario a ingresar algo.

Se requiere una anotación de datos para la vista. La vista requerirá que tenga un valor antes de aceptar una publicación de formulario.

Que el valor sea anulable está relacionado con lo que está permitido en la base de datos. Un valor puede ser nulo en la base de datos, o el valor puede persistir como nulo.

Son aspectos separados.

Se required para la validación del cliente pero se puede nullable para el mapeo DB