public IEnumerable <ValidationResult> Validate(ValidationContext validationContext)
        {
            string countryCodeFromInput = "";

            // 2. b. Trim all strings of leading and trailing spaces (fields not trimmed here
            // are trimmed by TACapitalize and TAExtractDigits methods below)
            if (ProvinceCode != null)
            {
                ProvinceCode = ProvinceCode.Trim();
            }
            if (Email != null)
            {
                Email = Email.Trim();
            }
            if (Comment != null)
            {
                Comment = Comment.Trim();
            }

            // 2.d. Using our library method to capitalize names, address and city
            FirstName       = ISValidations.ISCapitalize(FirstName);
            LastName        = ISValidations.ISCapitalize(LastName);
            SpouseFirstName = ISValidations.ISCapitalize(SpouseFirstName);
            SpouseLastName  = ISValidations.ISCapitalize(SpouseLastName);
            Street          = ISValidations.ISCapitalize(Street);
            City            = ISValidations.ISCapitalize(City);

            // 2.e. Compiling the full name from member's last and first name and
            // their spouse's names

            if (SpouseLastName == "" && SpouseFirstName == "")
            {
                FullName = LastName + ", " + FirstName;
            }
            else
            {
                if (SpouseLastName == "")
                {
                    FullName = LastName + ", " + FirstName + " & " + SpouseFirstName;
                }
                else
                {
                    if (SpouseLastName == LastName)
                    {
                        FullName = LastName + ", " + FirstName + " & " + SpouseFirstName;
                    }
                    else
                    {
                        FullName = LastName + ", " + FirstName + " & " + SpouseLastName +
                                   ", " + SpouseFirstName;
                    }
                }
                if (SpouseFirstName == "")
                {
                    FullName = LastName + ", " + FirstName + " & " + SpouseLastName;
                }
            }

            // 2.f. Force the province code to upper cases and validate it
            if (ProvinceCode != null && ProvinceCode != "")
            {
                string   errors   = "";
                Province province = new Province();

                ProvinceCode = ProvinceCode.ToUpper();
                // we try to fetch a province record with the same province code from database
                try
                {
                    province = _context.Province.FirstOrDefault(p => p.ProvinceCode == ProvinceCode);
                }
                catch (Exception ex)
                {
                    errors = ex.GetBaseException().Message;
                }

                // if fetching province code throws an exception, put its innermost message in ModelState
                if (errors != "")
                {
                    yield return(new ValidationResult(errors,
                                                      new[] { "ProvinceCode" }));
                }
                // if it's not on the file, display an appropriate message
                if (province == null)
                {
                    yield return(new ValidationResult("This province code is not on the file",
                                                      new[] { "ProvinceCode" }));
                }
                else
                {
                    // 2.f.iii. Retain a record's Country field to use it in the postal code validation
                    countryCodeFromInput = province.CountryCode;
                }

                // 2.g.i. Validate and format the postal/zip code depending on the country of origin
                if (countryCodeFromInput == "CA")
                {
                    if (ISValidations.ISPostalCodeValidation(PostalCode))
                    {
                        PostalCode = ISValidations.ISPostalCodeFormat(PostalCode);
                    }
                    else
                    {
                        yield return(new ValidationResult("The postal code must be in format A1A 1A1",
                                                          new[] { "PostalCode" }));
                    }
                }
                else if (countryCodeFromInput == "US")
                {
                    string postalCode = PostalCode;
                    if (!ISValidations.ISZipCodeValidation(ref postalCode))
                    {
                        yield return(new ValidationResult("This zip code must contain 5 or 9 digits",
                                                          new[] { "PostalCode" }));
                    }
                    else
                    {
                        PostalCode = postalCode;
                    }
                }
            }

            // 2.g. If the postal code is provided, but the province code isn't, throw an error
            else
            {
                if (PostalCode != null && PostalCode != string.Empty)
                {
                    yield return(new ValidationResult("The province/state code is required to validate the " +
                                                      "postal/zip code", new[] { "ProvinceCode" }));
                }
            }

            // 2.h.i. Home phone must contain 10 digits
            HomePhone = ISValidations.ISExtractDigits(HomePhone);
            if (HomePhone.Length != 10)
            {
                yield return(new ValidationResult("The phone number must be 10 digits long",
                                                  new[] { "HomePhone" }));
            }
            else
            {
                // 2.h.ii. If it does, reformat it into dash notation
                HomePhone = HomePhone.Substring(0, 3) + "-" + HomePhone.Substring(3, 3) + "-" +
                            HomePhone.Substring(6);
            }

            // Email address must be a valid email pattern
            if (!(new EmailAddressAttribute()).IsValid(Email))
            {
                yield return(new ValidationResult("The Email address is in incorrect format ",
                                                  new[] { "Email" }));
            }

            // 2.j. Year Joined can only be null when editing an existing record
            if (MemberId == 0 && YearJoined == null)
            {
                yield return(new ValidationResult("Year Joined cannot be empty for a new " +
                                                  "record", new[] { "YearJoined" }));
            }
            // 2.j. Year Joined cannot be in the future
            if (YearJoined != null)
            {
                if (YearJoined > DateTime.Now.Year)
                {
                    yield return(new ValidationResult("The year the member joined the club cannot " +
                                                      "be in the future", new[] { "YearJoined" }));
                }
            }

            // 2.k. default taskExepmpt and useCanadaPost to false
            if (TaskExempt == null)
            {
                TaskExempt = false;
            }
            if (UseCanadaPost == null)
            {
                UseCanadaPost = false;
            }

            // 2.l.i If useCanadaPost is false, valid email is required
            if (UseCanadaPost == false)
            {
                if (Email == null || Email == "")
                {
                    yield return(new ValidationResult("Email address is required unless member has " +
                                                      "restricted communication to Canada Post", new[] { "Email" }));
                }
            }
            // 2.l.ii. If useCanadaPost is true, all the postal fields are required
            else
            {
                if (Street == null || Street == "")
                {
                    yield return(new ValidationResult("Member wants to use Canada Post - Street " +
                                                      "Address is required", new[] { "Street" }));
                }
                if (City == null || City == "")
                {
                    yield return(new ValidationResult("Member wants to use Canada Post - City/Town " +
                                                      "is required", new[] { "City" }));
                }
                if (ProvinceCode == null || ProvinceCode == "")
                {
                    yield return(new ValidationResult("Member wants to use Canada Post - Province " +
                                                      "Code is required", new[] { "ProvinceCode" }));
                }
                if (PostalCode == null || PostalCode == "")
                {
                    yield return(new ValidationResult("Member wants to use Canada Post - Postal " +
                                                      "Code is required", new[] { "PostalCode" }));
                }
            }
            yield return(ValidationResult.Success);
        }