una ultimos reemplazar recortar quitar obtener los extraer ejemplos caracteres cadena c# entity-framework validation ef-code-first data-annotations

ultimos - string format c#



Permitir cadenas vacĂ­as para los campos marcados con PhoneAttribute o UrlAttribute (2)

Estoy usando CodeFirst Entitty framework 5. Tengo una clase que representa un usuario.

public class User { [Key] public int UserId { get; set; } [Url] [DataType(DataType.Url)] [Required(AllowEmptyStrings= true)] public string WebSite { get; set; } [Phone] [DataType(DataType.PhoneNumber)] [Required(AllowEmptyStrings = true)] public string Phone { get; set; } [Phone] [DataType(DataType.PhoneNumber)] [Required(AllowEmptyStrings = true)] public string Fax { get; set; } }

Me gustan mucho los mecanismos de validación para Phone y Url , pero desafortunadamente la validación falla cuando los campos marcados con estos atributos son cadenas vacías que realmente quiero permitir. [Required(AllowEmptyStrings = true)] no parece funcionar con los atributos de Phone o Url . Lo mismo parece aplicarse a otros atributos de DataAnnotations como EmailAddress .

¿Hay alguna manera de permitir cadenas vacías para los campos marcados con dichos atributos?


Los atributos de validación como [Phone] y [EmailAddress] verificará cualquier valor de cadena que no sea nulo. Como el tipo de string es inherentemente anulable, las cadenas vacías pasadas a ModelBinder se leen como null , lo que pasa la comprobación de validación.

Cuando agrega el atributo [Required] , la cadena se convierte efectivamente en no anulable. (Si usa Code First, EF creará una columna de base de datos no anulable.) ModelBinder interpretará ahora un valor en blanco como String.Empty , que no pasará la comprobación de validación de atributo.

Por lo tanto, no hay forma de permitir cadenas vacías con atributos de validación, pero puede permitir cadenas nulas . Todo lo que necesita hacer es eliminar el atributo [Required] . Los valores en blanco serán null y los valores no en blanco serán validados.

En mi caso, estoy importando registros de un archivo CSV, y tuve este problema porque me estaba salteando el ModelBinder normal. Si está haciendo algo inusual como este, asegúrese de incluir una verificación manual antes de guardarlo en su modelo de datos:

Email = (record.Email == String.Empty) ? null : record.Email


Use las siguientes dos anotaciones de datos:

[Required(AllowEmptyStrings = true)] [DisplayFormat(ConvertEmptyStringToNull = false)]