Разрешить пустые строки для полей, отмеченных с помощью PhoneAttribute или UrlAttribute
Я использую CodeFirst Entitty framework 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
. То же самое относится к некоторым другим атрибутам DataAnnotations, таким как EmailAddress
.
Есть ли способ разрешить пустые строки для полей, отмеченных такими атрибутами?
Ответы
Ответ 1
Атрибуты проверки, такие как [Phone]
и [EmailAddress]
, будут проверять любые ненулевые значения строк. Поскольку тип string
по своей сути является нулевым, пустые строки, переданные в ModelBinder, считаются как null
, который проходит проверку проверки.
Когда вы добавляете атрибут [Required]
, строка становится эффективно не нулевой. (Если использовать Code First, EF будет script столбцом базы данных, не подлежащим обнулению). ModelBinder теперь интерпретирует пустое значение как String.Empty
- которое не даст проверки проверки атрибута.
Таким образом, нет возможности разрешить пустые строки с атрибутами проверки, но вы можете разрешить нулевые строки. Все, что вам нужно сделать, это удалить атрибут [Required]
. Пустые значения будут null
, а непустые значения будут проверены.
В моем случае я импортирую записи из CSV файла и имел эту проблему, потому что я пропускал обычный ModelBinder. Если вы делаете что-то необычное, обязательно включите ручную проверку перед сохранением в вашу модель данных:
Email = (record.Email == String.Empty) ? null : record.Email
Ответ 2
Используйте следующие две аннотации данных:
[Required(AllowEmptyStrings = true)]
[DisplayFormat(ConvertEmptyStringToNull = false)]