2010-05-17 4 views
5

У меня есть главная страница, которая содержит элемент управления Login, чтобы пользователь мог войти в систему/выйти из любой страницы. Однако для нескольких страниц контента требуется элемент управления Recaptcha. Это вызывает проблемы, потому что, когда я пытаюсь войти на страницу с элементом Recaptcha, система ожидает, что я войду в слова. Я знаю об отсутствии групп проверки в элементе управления Recaptcha и о том, что на странице ASP.NET не может быть нескольких форм. Есть ли способ обойти это? «Яркий» способ, о котором я могу думать, находится в событии «Вход», проверьте страницу для элемента управления Recaptcha. Если он существует, отключите его, иначе продолжите. Тем не менее, это выглядит довольно неэффективно, особенно когда есть несколько страниц, и у большинства из них не будет управления Recaptcha.Recaptcha запускается из управления главной страницы

ответ

3

Обойти эту проблему следующим образом:

  1. Установить ValidationGroup на кнопку Login. Элемент управления reCAPTCHA не будет проверяться при нажатии кнопки с ValidationGroup, установленной на непустую.
  2. На страницах, для которых требуется подтверждение валидации, держите значение ValidationGroup в кнопке непустым (в противном случае также будут проверены поля входа в систему), но вызовите RecaptchaControl.Validate() вручную в подпрограмме.

Discussion threadofficial reCAPTCHA dev mailing list.

+0

Неправильное использование. К сожалению, recaptcha не соответствует шаблону asp.net. Контроллер recaptcha не заботится о группах валидации. Свойство IsValid оценивается каждый раз. Внутри этого метода выполняются только следующие проверки: 'if (Page.IsPostBack && Visible && Enabled &&! This.skipRecaptcha)' Таким образом, единственный способ (в данном случае) - сохранить recaptcha от проверки, кроме того, чтобы отключить или скрыть его , устанавливая свойство 'SkipRecaptcha' равным true. – ntziolis

+0

Я стою исправлено. Код на стороне сервера не работает с описанным выше решением, но код на стороне клиента. Я исправил исправление для репозитория, чтобы исправить эту проблему. Для иллюстрации использования также есть тестовая страница (test/ValidationGroup.aspx). –

+0

Thats great! Я попробую это очень скоро, thx для исправления. – ntziolis

0

Что вы должны сделать, это следующее:

<form runat="server"></form> 

должны быть обернуты вокруг всего содержания страницы, в вашем случае на главной странице, так как там Войти, как хорошо.

С этого момента вы можете просто удалить элемент recaptcha на любой странице, которая происходит на данной главной странице. Вам не нужен еще один тег <form runat="server"></form>.

Вы должны понимать, что элемент управления recaptcha не связан с формой html submit и ни одной конкретной конкретной кнопкой. Каждый раз, когда страница отправляет обратно, recaptcha устанавливает флаг Page.IsValid.

К сожалению, recaptcha не соответствует стандартам ASP.NET, используя инициированную проверку в сочетании с группами проверки.
Так, чтобы предотвратить повторную проверку каждый раз, вы должны установить: SkipRecaptcha = true

Это заставляет recaptcha не проверять. Итак, теперь рассмотрен сценарий входа в систему. Если вы действительно хотите использовать функциональность recaptcha, вы просто установите SkipRecaptcha = false и позвоните по телефону Page.Validate(). Впоследствии вы можете продолжить работу с Page.IsValid.

Более чистым и лучшим подходом было бы переписать элемент управления recaptcha, чтобы использовать класс BaseValidator. Это позволит вам указать группу проверки на элемент управления recaptcha и кнопку, которая отправляет входные данные, которые вы хотите защитить с помощью recaptcha. При нажатии кнопки происходит только проверка правильности указанной группы проверки.
Кроме того, вам необходимо указать группу проверки для кнопки входа или установить CausesValidation = false. Если группа проверки не установлена ​​и кнопка будет нажата, все группы проверки будут проверены автоматически.
Это, однако, довольно продвинуто, так что даже ребята recaptcha отказались от него, однако в исходном контроле все еще есть старая версия. Нет гарантии, что эта версия все еще работает. Дайте нам знать, как вы решили.

+0

Класс BaseValidator получен из элемента управления Label, которого нет в reCAPTCHA. –

+0

Я никогда не говорил, что это было бы, мой первый подход заключался бы в создании составного элемента управления со всеми элементами управления, необходимыми для работы recaptcha, и просто добавлением дополнительного элемента управления, который обрабатывает валидацию и упрощает реализацию, вытекает из класса BaseValidatior (и btw. ** старая версия, фактически полученная из BaseValidator **) – ntziolis

+0

Способ рендеринга reCAPTCHA не оправдывает наличие дочерних элементов управления (он состоит из одного тега

Смежные вопросы