C # Как использовать DataAnnotations StringLength и SubString для удаления текста - PullRequest
13 голосов
/ 13 марта 2011

У меня есть классы моделей, у которых есть свойство description с атрибутом аннотации данных StringLength, а длина установлена ​​в 100 символов. Когда это свойство содержит более 100 символов и Entity Framework пытается сохранить это свойство, я получаю следующую ошибку.

 [StringLength(100, ErrorMessage = "Description Max Length is 100")]
        public string Description { get; set; }

Ошибка:
«Проверка не удалась для одного или нескольких объектов. Дополнительные сведения см. В свойстве« EntityValidationErrors »»

Я не уверен, помогает ли это в формировании решения, но я использую Entity Framework CTP5 и Code First.

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

Я полагаю, что смогу использовать атрибут DataAnnotation StringLength вручную, чтобы помочь мне определить действительную длину описания, а затем использовать SubString для удаления любых символов сверх допустимого количества.

Кто-нибудь знает, как использовать DataAnnotation в этой ситуации? Или есть другие варианты, которые доступны?


Обновление Я сделал то, что предложил BrokenGlass, и вот моя реализация, если:

public static class DataAnnotation
{
    public static int? GetMaxLengthFromStringLengthAttribute(Type modelClass, string propertyName)
    {
        int? maxLength = null;
        var attribute = modelClass.GetProperties()
                        .Where(p => p.Name == propertyName)
                        .Single()
                        .GetCustomAttributes(typeof(StringLengthAttribute), true)
                        .Single() as StringLengthAttribute;

        if (attribute != null)
            maxLength = attribute.MaximumLength;

        return maxLength;
    }
}


int? maxLength = DataAnnotation.GetMaxLengthFromStringLengthAttribute(typeof(Car), "Description");

if(maxLength != null && car.Description.Length > maxLength)
    car.Description = car.Description.Substring(0, maxLength.Value);

BarDev

Ответы [ 3 ]

10 голосов
/ 10 июня 2011

Почему все хлопоты? Почему не

private string _description = string.Empty;

[StringLength(100, ErrorMessage = "Description Max Length is 100")]
public string Description 
{  
    get { return _description; }
    set { _description = value.Substring(0,100); };  // or something equivalent
} 
10 голосов
/ 13 марта 2011

Вы всегда можете проверить значение атрибута, используя отражение, хотя такой подход не самый лучший, если вы можете обойти его - это не красиво:

var attribute = typeof(ModelClass).GetProperties()
                                  .Where(p => p.Name == "Description")
                                  .Single()
                                  .GetCustomAttributes(typeof(StringLengthAttribute), true) 
                                  .Single() as StringLengthAttribute;

Console.WriteLine("Maximum Length: {0}", attribute.MaximumLength);    
2 голосов
/ 13 марта 2011

Создайте модель представления, у которой нет аннотации данных для длины, затем вы можете сопоставить ее с моделью сущности и обрезать значение, если оно длиннее 100.

...