Подтвердить что ты не робот

Разрешить пустые строки для полей, отмеченных с помощью 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.

Есть ли способ разрешить пустые строки для полей, отмеченных такими атрибутами?

4b9b3361

Ответ 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)]