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属性にも同じことが当てはまるようです。
そのような属性でマークされたフィールドに空の文字列を許可する方法はありますか?
[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
次の2つのデータアノテーションを使用します。
[Required(AllowEmptyStrings = true)]
[DisplayFormat(ConvertEmptyStringToNull = false)]