using System; using System.ComponentModel.DataAnnotations; using System.Text; namespace Kreta.Core.CustomAttributes { [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter)] public class EmailAddressExtendedAttribute : DataTypeAttribute { public bool IsNullValid { get; } public bool IsEmptyValid { get; } //NOTE: A beépített EmailAddressAttribute a null-t valid true-nak, az üres string-et valid false-nak veszi alapból, ezért ezek a default értékek itt is! public EmailAddressExtendedAttribute(bool isNullValid = true, bool isEmptyValid = false) : base(DataType.EmailAddress) { IsNullValid = isNullValid; IsEmptyValid = isEmptyValid; } public override bool IsValid(object value) { //NOTE: Null esetében, az IsNullValid property értékétől függően térünk vissza, hogy valid-e vagy sem! if (value == null) { return IsNullValid; } string valueAsString = value as string; //NOTE: Ha nem sikerül string-é alakítani a nem null value-t, akkor rossz a value típusa, ezért nem lesz valid! if (valueAsString == null) { return false; } //NOTE: Üres string esetében, az IsEmptyValid property értékétől függően térünk vissza, hogy valid-e vagy sem! if (valueAsString == string.Empty) { return IsEmptyValid; } //NOTE: Azért encode-oljuk ISO-8859-8-ra, mert ezzel kiszedjük az ékezeteket(és az esetleges egyéb nem engedélyezett karaktereket) a valueAsString-ből. // Ha az encode-olás utáni string nem egyezik meg az eredeti valueAsString-el, akkor volt benne ékezet(vagy egyéb nem engedélyezett karakter) és nem valid az email cím! byte[] tempByteArray = Encoding.GetEncoding(Constants.EncodingName.ISO_8859_8).GetBytes(valueAsString); string encodedString = Encoding.UTF8.GetString(tempByteArray); if (!encodedString.Equals(valueAsString)) { return false; } //NOTE: Végül levalidáljuk a beépített EmailAddressAttribute validációjával! bool result = new EmailAddressAttribute().IsValid(valueAsString); return result; } } }