web-dev-qa-db-ja.com

PhoneAttributeまたはUrlAttributeでマークされたフィールドに空の文字列を許可します

CodeFirst Entittyフレームワーク5を使用しています。ユーザーを表すクラスがあります。

_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; }
}
_

私はPhoneおよびUrl属性の検証メカニズムが大好きですが、これらの属性でマークされたフィールドが実際に許可したい空の文字列である場合、残念ながら検証に失敗します。 [Required(AllowEmptyStrings = true)]は、PhoneまたはUrl属性では機能しないようです。 EmailAddressのような他のDataAnnotations属性にも同じことが当てはまるようです。

そのような属性でマークされたフィールドに空の文字列を許可する方法はありますか?

26
Nu-hin

[Phone][EmailAddress]などの検証属性は、null以外の文字列値をチェックします。 string型は本質的にnull許容であるため、ModelBinderに渡される空の文字列はnullとして読み取られ、検証チェックに合格します。

[Required]属性を追加すると、文字列は事実上null不可になります。 (Code Firstを使用する場合、EFはNull不可のデータベース列のスクリプトを作成します。)ModelBinderは、空の値をString.Emptyとして解釈するようになりました。これは、属性検証チェックに失敗します。

そのため、検証属性を持つempty文字列を許可する方法はありませんが、null文字列を許可できます。必要なことは、[Required]属性を削除することだけです。空白の値はnullになり、空白以外の値が検証されます。

私の場合、CSVファイルからレコードをインポートしていますが、通常のModelBinderをスキップしていたため、この問題が発生しました。このような異常なことをしている場合は、データモデルに保存する前に必ず手動で確認してください。

Email = (record.Email == String.Empty) ? null : record.Email
22
Neil Laslett

次の2つのデータアノテーションを使用します。

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