开发者

C# How to use DataAnnotations StringLength and SubString to remove text

开发者 https://www.devze.com 2023-02-16 17:27 出处:网络
I have a model classes that has a description property with a data annotation attribute of StringLength and length is set to 100 characters.When this property is more than 100 characters and Entity Fr

I have a model classes that has a description property with a data annotation attribute of StringLength and length is set to 100 characters. When this property is more than 100 characters and Entity Framework tries to save this property I get the following error.

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

Error:

"Validation failed for one or more entities. See 'EntityValidationErrors' property for more details"

I'm not sure if this helps in forming a solution, but I'm using Entity Framework CTP5 and Code First.

What I want to do, is if description is more than 100 characters, then remove characters that are more than 100 characters so that description can be stored and no error will be raised.

I believe I should be able to use the DataAnnotation attribute StringLength manually to help me identify the valid length of description and then use SubString to remove any characters over the valid amount.

Does anyone know how to use DataAnno开发者_Go百科tation in this situation? Or is there another options that is available?


Update I did what BrokenGlass suggested and here my implementation if:

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


You could always check the attribute value using reflection, though that approach is not the best if you can get around it - it's not pretty:

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);    


Why all the hassle? Why not

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
} 


Create a view model that doesn't have a data annotation for the length, then you can map it to the entity model and truncate the value if it's longer than 100.

0

精彩评论

暂无评论...
验证码 换一张
取 消