2008-10-23 33 views
10

Tôi đang sử dụng plugin ASP.Net và kiểm soát được cung cấp bởi reCAPTCHA. Tôi có thể kiểm soát thành công để làm việc nếu nút gửi trên biểu mẫu web không có trong validationgroup. Không có thuộc tính validationgroup cho điều khiển reCAPTCHA.Làm thế nào để làm cho reCAPTCHA làm việc với một ValidationGroup trong ASP.Net (captcha)

Có ai có bất kỳ thành công nào với giải pháp này hoặc bất kỳ giải pháp nào để kiểm soát reCAPTCHA hoạt động khi có một validationgroup trên biểu mẫu web không?

Trả lời

4

Plugin reCAPTCHA ASP.NET được viết tương thích ngược với ASP.NET 1.1, có nghĩa là khái niệm ValidationGroup (mới trong ASP.NET 2.0) không được hỗ trợ. Tuy nhiên, trình cắm này đi kèm với downloadable source code, vì vậy bạn có thể tự sửa đổi nó để hỗ trợ ValidationGroup.

Trong ASP.NET 2.0, validators should inherit from BaseValidator và thực hiện IValidator, có nghĩa là bạn nên thay đổi kiểu RecaptchaControl kế thừa từ BaseValidator thay vì WebControl. Sau đó, bạn sẽ phải sửa đổi mã một chút để thực hiện tất cả các phương thức và thuộc tính được xác định trong BaseValidator. Sau đó, bạn có thể sử dụng điều khiển mới này trên trang của mình thay thế, hiện hỗ trợ ValidationGroup.

+0

Xin chào bzlm. Tôi đã thực hiện ở trên, nhưng có hai vấn đề: 1) BaseValidator cũng yêu cầu bạn phải thực hiện phương thức EvaluateIsValid() trừu tượng (reutrning thuộc tính IsValid với nó không hoạt động). 2) Điều khiển reCaptcha sau đó cần thuộc tính ControlToValidate đầy. Bạn có thể giúp với bất kỳ thứ gì trong số đó không? Cảm ơn. – Nick

+0

Tôi đã nhận xét việc triển khai IValidator được cung cấp bởi plugin reCAPTCHA và đã đẩy logic đó vào phương thức EvaluateIsValid(). Tôi cũng bỏ qua thuộc tính ControlToValidate trong mã vì nó dường như không áp dụng trong trường hợp này. Một điểm khác cần lưu ý là bạn nên xử lý các tình huống khi xác thực được gọi nhiều lần trên trang. Bạn cần đảm bảo rằng bạn không thực sự gọi API reCAPTCHA hai lần vì điều này sẽ làm mất hiệu lực kiểm soát. Hi vọng điêu nay co ich. – rifferte

+1

Xin chào, bạn có thể tìm hiểu thêm về cách thực hiện việc này không? Hoặc có ai đó đã có một dự án hoàn thành mà họ có thể chia sẻ? – TimS

5

Bạn có thể thêm CustomValidator, triển khai OnServerValidate sẽ xác thực dữ liệu ReCAPTCHA. CustomValidator có thể được gán cho bất kỳ ValidatorGroup nào.

+0

Giải pháp tốt. Bạn chỉ cần kiểm tra recaptcha.IsValid trong phương thức OnServerValidate của bạn sau đó. Rất đơn giản! – Obfuskater

2

này làm việc cho tôi ...

  1. Thêm một validator tùy chỉnh với nhóm xác nhận chính xác.

  2. nó gọi mình phương pháp ServerValidate ..

    recaptcha.Validate(); 
    
  3. Sau đó kiểm tra như sau trước khi chế biến chính của bạn ...

    if (Page.IsValid & & recaptcha.IsValid) { respose .write ("hợp lệ"); }

HTH.

+1

Về cơ bản, điều này không giống như trong câu trả lời này: http://stackoverflow.com/questions/231344/how-to-make-recaptcha-work-with-a-validationgroup-in-asp-net-captcha/656888 # 656888 – bzlm

0

Xem ReCaptchaImage và ReCaptchaValidator điều khiển là một phần của Altairis Web UI Toolkit: http://altairiswebui.codeplex.com/

Đó là bộ mã nguồn mở của các thành phần web, chứa khá phong nha và ASP.NET tiêu chuẩn phù hợp (nếu tôi có thể nói nó là tác giả: -) triển khai ReCaptcha cho biểu mẫu web.

7

Nghĩ rằng tôi chỉ muốn mở rộng trên các ý kiến ​​của một vài người khác với một số mã làm việc ...

<recaptcha:RecaptchaControl ID="RecaptchaControl" runat="server" /> 

<asp:CustomValidator ID="RecaptchaValidator" runat="server" OnServerValidate="RecaptchaValidator_ServerValidate" ErrorMessage="Recaptcha input invalid." ValidationGroup="SomeValidationGroup" /> 

Và mã sau ...

protected void RecaptchaValidator_ServerValidate(object sender, ServerValidateEventArgs e) 
{ 
    this.RecaptchaControl.Validate(); 
    e.IsValid = this.RecaptchaControl.IsValid; 
} 

bất cứ ai có thể nghĩ ra một đơn giản hơn cách làm nó? Kudos để Vidalik cho những suy nghĩ về cách sử dụng OnServerValidate.

+2

+1 để cung cấp mã làm việc. –

1

Đề xuất của RemotecUk đã làm việc cho tôi mà không thêm trình xác thực tùy chỉnh.

protected void button_onclick(object sender, EventArgs e){ 
    recaptcha.Validate(); 
    if(!Page.IsValid && recaptcha.IsValid){ 
     lblError.Text = "Please check your captcha entry"; 
    } else { 
     //do your thing 
    } 
} 
1

Để xác thực yêu cầu phía máy khách và không thay đổi mã nguồn reCaptcha, tôi đã thêm CustomValidator vào biểu mẫu của tôi và tạo hàm JavaScript để xác thực trường văn bản nhập.

<asp:CustomValidator ID="reqRecaptcha" runat="server" ClientValidationFunction="validateRecaptcha" Text="Required"></asp:CustomValidator> 

Để tìm hiểu các ID của lĩnh vực đầu vào tạo ra tôi nhìn vào mã nguồn của trang và nhận thấy rằng các lĩnh vực đầu vào luôn recaptcha_response_field. (Hãy sửa tôi nếu tôi sai) Biết được điều này, tôi đã có thể tạo ra JavaScript (sử dụng JQuery và một hàm tùy chỉnh để kiểm tra tính hợp lệ của một điều khiển).

function validateRecaptcha(sender, args) { 
     args.IsValid = isFieldValid("input[id$='recaptcha_response_field']"); 
    } 

LƯU Ý: Nếu nhà phát triển thay đổi đầu ra của điều khiển reCaptcha, bạn có thể không nhận thức được sự thay đổi dẫn đến trình xác thực bắt giữ hoạt động.

+0

'isFieldValid (" đầu vào [id $ = 'recaptcha_response_field'] "); 'cũng có thể là' isFieldValid ("# recaptcha_response_field"); '. Tham chiếu ban đầu của tôi là một tiêu chuẩn mà tôi có để tôi có thể dễ dàng tạo CustomValidators cho các điều khiển máy chủ. – cbillowes

Các vấn đề liên quan