J'utilise le framework CodeFirst Entitty 5. J'ai une classe représentant un utilisateur.
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; }
}
J'aime beaucoup les mécanismes de validation pour les attributs Phone
et Url
, mais malheureusement la validation échoue lorsque les champs marqués avec ces attributs sont des chaînes vides que je veux réellement autoriser. [Required(AllowEmptyStrings = true)]
ne semble pas fonctionner avec les attributs Phone
ou Url
. La même chose semble s'appliquer à certains autres attributs DataAnnotations comme EmailAddress
.
Existe-t-il un moyen d'autoriser des chaînes vides pour les champs marqués avec de tels attributs?
Attributs de validation tels que [Phone]
et [EmailAddress]
vérifiera toutes les valeurs de chaîne non nulles. Étant donné que le type string
est intrinsèquement nullable, les chaînes vides passées au ModelBinder sont lues comme null
, qui passe la vérification de validation.
Lorsque vous ajoutez le [Required]
attribut, la chaîne devient effectivement non nulle. (Si vous utilisez Code First, EF scriptera une colonne de base de données non nullable.) Le ModelBinder interprétera désormais une valeur vide comme String.Empty
- qui échouera à la vérification de validation des attributs.
Il n'y a donc aucun moyen d'autoriser les chaînes vides avec des attributs de validation, mais vous pouvez autoriser les chaînes null. Il vous suffit de supprimer le [Required]
attribut. Les valeurs vides seront null
et les valeurs non vides seront validées.
Dans mon cas, j'importe des enregistrements à partir d'un fichier CSV et j'ai eu ce problème car je sautais le ModelBinder normal. Si vous faites quelque chose d'inhabituel comme celui-ci, assurez-vous d'inclure une vérification manuelle avant d'enregistrer dans votre modèle de données:
Email = (record.Email == String.Empty) ? null : record.Email
Utilisez les deux annotations de données suivantes:
[Required(AllowEmptyStrings = true)]
[DisplayFormat(ConvertEmptyStringToNull = false)]