web-dev-qa-db-fra.com

Autoriser les chaînes vides pour les champs marqués avec PhoneAttribute ou UrlAttribute

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?

26
Nu-hin

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
22
Neil Laslett

Utilisez les deux annotations de données suivantes:

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