Как я могу использовать классы атрибутов данных для атрибутов, чтобы сбой строк в формах?

Я пытался потребовать текстовое поле ввода в форме, что подразумевает, что в форме должно быть что-то. Однако добавление тега [Required] к моей модели не работало. В частности, посмотрите на свойство User Name:

public class ColumnWidthMetaData {
    [DisplayName("Column Name")]
    [Required]
    public string ColName { get; set; }

    [DisplayName("Primary Key")]
    public int pKey { get; set; }

    [DisplayName("User Name")]
    [Required]
    public string UserName { get; set; }

    [DisplayName("Column Width")]
    [Required]
    public int Width { get; set; }
}

Это позволяет пустым строкам пройти проверку модели, и в итоге возникает ошибка базы данных при попытке вставить значение NULL для имени пользователя.

Как я могу изменить эти атрибуты, чтобы они делали то, что им казалось, что они должны делать?

Ответ 1

После многого поиска в Google и просмотра Stackoverflow у меня ничего не было.

Я пошел в MSDN и посмотрел на пространство имен System.ComponentModel.DataAnnotations.

Там я более внимательно посмотрел на атрибут Required и заметил свойство AllowEmptyStrings. Установка этого параметра в false указывает атрибуту не разрешать пустые строки, которые я бы предположил, это поведение по умолчанию, поскольку, как точка Required требует, чтобы что-то было введено, а пустая строка указывает, что ничего.

Это не решает проблему, хотя по умолчанию пустые строки принуждаются к null, которые не являются пустыми строками и поэтому разрешены. Еще раз это абсурдно, так как Required должен проверить, что что-то введено, а null указывает, что ничего не было введено. Однако на странице AllowEmptyStrings есть ссылка на DisplayFormAttribute Свойство ConvertEmptyStringsToNull. Если вы установите значение false, то пустые строки останутся пустыми, а затем требуемый тег не позволит их.

Итак, здесь fix:

public class ColumnWidthMetaData {
    [DisplayName("Column Name")]
    [Required(AllowEmptyStrings=false)]
    [DisplayFormat(ConvertEmptyStringToNull=false)]
    public string ColName { get; set; }

    [DisplayName("Primary Key")]
    public int pKey { get; set; }

    [DisplayName("User Name")]
    [Required(AllowEmptyStrings=false)]
    [DisplayFormat(ConvertEmptyStringToNull=false)]
    public string UserName { get; set; }

    [DisplayName("Column Width")]
    [Required]
    public int Width { get; set; }
}    

Ответ 2

Я бы применил новый атрибут проверки, подобный этому, и применил его к моей модели.

public class RequiredNotEmptyAttribute : RequiredAttribute
{
    public override bool IsValid(object value)
    {
        if(value is string) return String.IsNullOrEmpty((string)value);

        return base.IsValid(value);
    }
}

Это будет работать только на стороне сервера (клиентская сторона все равно будет проверять только значение null).

Ответ 3

Вы можете добавить DefaultValueAttribute к свойству, которое требует значения по умолчанию (например, string.Empty для UserName)

[DisplayName("User Name")]
[System.ComponentModel.DefaultValue("")]
public string UserName { get; set; }