public override void RenderControl(HtmlTextWriter writer)
        {
            NoCaptcha nc = (string.IsNullOrEmpty(SiteKey) || string.IsNullOrEmpty(SecretKey)) ?
                           new NoCaptcha() :
                           new NoCaptcha(SiteKey, SecretKey);

            writer.AddAttribute(HtmlTextWriterAttribute.Class, "g-recaptcha");
            writer.AddAttribute("data-sitekey", nc.SiteKey);
            if (UseSecureToken)
            {
                writer.AddAttribute("data-stoken", nc.SecureToken);
            }
            writer.AddAttribute("data-theme", Theme.ToString().ToLower());
            writer.AddAttribute("data-type", Type.ToString().ToLower());
            writer.AddAttribute("data-size", Size.ToString().ToLower());

            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.RenderEndTag();

            if (!IsValid && ((Page)HttpContext.Current.Handler).IsPostBack)
            {
                writer.AddAttribute(HtmlTextWriterAttribute.Class, ErrorCssClass);
                writer.RenderBeginTag(HtmlTextWriterTag.Div);
                writer.WriteEncodedText(ErrorMessage);
                writer.RenderEndTag();
            }
        }
        protected override bool EvaluateIsValid()
        {
            NoCaptcha nc = (string.IsNullOrEmpty(SiteKey) || string.IsNullOrEmpty(SecretKey)) ?
                           new NoCaptcha() :
                           new NoCaptcha(SiteKey, SecretKey);

            string clientResponse = GetClientResponse();

            if (string.IsNullOrEmpty(clientResponse))
            {
                return(false);
            }
            var result = nc.Validate(clientResponse, GetClientIP());

            IsValid = result.Succeeded;
            if (IsValid)
            {
                return(true);
            }

            List <string> errors = new List <string>();

            if (result.ErrorMessages == null)
            {
                errors.Add("Unspecified Error");
            }
            else
            {
                foreach (string error in result.ErrorMessages)
                {
                    switch (error)
                    {
                    case "missing-input-secret":
                        errors.Add("The secret parameter is missing");
                        break;

                    case "invalid-input-secret":
                        errors.Add("The secret parameter is invalid or malformed");
                        break;

                    case "missing-input-response":
                        errors.Add("The response parameter is missing");
                        break;

                    case "invalid-input-response":
                        errors.Add("The response parameter is invalid or malformed");
                        break;

                    default:
                        errors.Add(error);
                        break;
                    }
                }
            }

            ErrorMessage = string.Join(", ", errors);

            return(false);
        }