public async Task<IValidationContext> UrlValid(string url)
        {
            string text = url;
            return await Task.Run(() =>
            {
                ValidationContext context = new ValidationContext();

                if (string.IsNullOrEmpty(text))
                {
                    context.ErrorMessages.Add("Please enter a URL.");
                    text = string.Empty;
                }

                //load url with parsed model url for further testing.
                text = HttpUtility.HtmlEncode(text.Trim());

                //Max supported length of IE: https://support.microsoft.com/en-us/kb/208427 (Other browsers support more however, this targets the most restrictive.)
                if (text.Length > 2048) context.ErrorMessages.Add("Please ensure URL is less than 2048 characters.");

                if (!Regex.IsMatch(text,
                        @"^(?:http|https|ftp)://[a-zA-Z0-9\.\-]+(?:\:\d{1,5})?(?:[\\_\-\#\*\(\)A-Za-z0-9\.\;\:\@\&\=\+\$\,\?/]|%u[0-9A-Fa-f]{4}|%[0-9A-Fa-f]{2})*$")) context.ErrorMessages.Add("Please enter a valid URL.");

                if (context.ErrorMessages.Count == 0) context.IsValid = true;

                return context;
            });

        }
        public async Task<IValidationContext> ShortUrlValid(IHomeModel model)
        {
            string text = model.Url;
            return await Task.Run(() =>
            {
                ValidationContext context = new ValidationContext();

                if (string.IsNullOrEmpty(text))
                {
                    context.ErrorMessages.Add("Please enter a URL.");
                    text = string.Empty;
                }

                //load url with parsed model url for further testing.
                text = HttpUtility.HtmlEncode(text.Trim());

                if (!Regex.IsMatch(text, String.Format("(http://)({0})(/)(\\w*)(?!\\W)$", model.Host))) context.ErrorMessages.Add("Please enter a valid URL.");

                if (context.ErrorMessages.Count == 0) context.IsValid = true;

                return context;
            });

        }