Как я могу вызвать функцию JavaScript, используя C# в Content Grabber?
Я пытаюсь вызвать функцию Javascript, используя C# в Content Grabber. (Content Grabber - это программа для просмотра веб-страниц).
Код Javascript таков:
$.definePage({
idRecaptcha: null,
init: function() {},
carregarReCaptcha: function() {
if(page.idRecaptcha == null) {
var sitekey = $("#reCaptchaPublicKey").val();
page.idRecaptcha = grecaptcha.render($("#tecRecaptcha")[0], {
'callback' : page.verifyCallback,
'sitekey': sitekey
});
}
},
verifyCallback: function(response) {
if(response) {
$("#form").submit();
}
}
});
var onloadCallback = function() {
page.carregarReCaptcha();
}
Я хочу вызвать функцию "verifyCallback". Эта функция, по сути, отправляет токен recaptcha, который будет проверять правильность введенного мной токена.
В моем агенте Content Grabber я хочу вызвать эту функцию, и у меня есть этот код, но он дает мне ошибку:
using System;
using System.Web.UI;
using Sequentum.ContentGrabber.Api;
public class Script
{
//See help for a definition of CustomScriptArguments.
public static CustomScriptReturn CustomScript(CustomScriptArguments args)
{
// retrieve page from current handler
var page = System.Web.HttpContext.Current.CurrentHandler as Page;
if (page == null)
{
// do something, e.g. throw exception
return CustomScriptReturn.Pause();
}
// Place your script code here.
// Return empty for no special action.
string response = args.DataRow["Captcha"];
string script = "page.verifyCallback('" + response + "');";
// call ClientScript from existing page instance
page.ClientScript.RegisterStartupScript(page.GetType(), "page.verifyCallback", script, true);
return CustomScriptReturn.Empty();
}
}
Когда я компилирую его, он возвращает эту ошибку:
Object reference not set to an instance of an object.
Похоже, я не могу просто удалить object sender, EventArgs e
Я не очень знаком с JS или C#, поэтому я был бы признателен за любую помощь, которую я могу получить. Спасибо вам большое!
2 ответа
В дополнение к ответу @Tetsuya, похоже, у вас возникнут проблемы с Javascript, который вы передаете в RegisterStartupScript.
Я не думаю, что вы сможете просто вызвать "verifyCallback", потому что это функция, определенная в рамках $.definePage({})
вызов.
Так что вам нужно глубже вникнуть в это и выяснить, verifyCallback
функция выставлена публично.
На основании этого кода:
var onloadCallback = function() {
page.carregarReCaptcha();
}
Я бы сказал, что вам нужно позвонить:
page.ClientScript.RegisterStartupScript(page.GetType(), "page.verifyCallback", script, true);
Проблема возникает потому, что вы пытаетесь использовать ClientScript
экземпляр из класса, который не унаследован от System.Web.UI.Page
(базовый класс для страниц с выделенным кодом). Пока у вас есть доступ к HttpContext.Current
, вы можете получить Page
экземпляр из его свойства обработчика (т.е. CurrentHandler
) и использовать ClientScript
как в примере ниже:
public class Script
{
//See help for a definition of CustomScriptArguments.
public CustomScriptReturn CustomScript(CustomScriptArguments args, object sender, EventArgs e)
{
// retrieve page from current handler
var page = HttpContext.Current.CurrentHandler as Page;
if (page == null)
{
// do something, e.g. throw exception
}
// Place your script code here.
// Return empty for no special action.
string response = args.DataRow["Token"];
string script = "verifyCallback('" + response + "');";
// call ClientScript from existing page instance
page.ClientScript.RegisterStartupScript(page.GetType(), "verifyCallback", script, true);
return CustomScriptReturn.Empty();
}
}
Обновить:
Что касается объяснения второй ошибки после редактирования, это произошло потому, что вы объявляете метод с именем callback
внутри CustomScript
метод, который не является действительным (и return
заявление должно быть на последнем). Если sender
а также EventArgs
обработчики не нужны, тогда просто опустите их. Вот пример, чтобы правильно вернуть CustomScriptReturn
:
public static CustomScriptReturn CustomScript(CustomScriptArguments args)
{
// retrieve page from current handler
var page = System.Web.HttpContext.Current.CurrentHandler as Page;
if (page == null)
{
// do something, e.g. throw exception
}
// Place your script code here.
// Return empty for no special action.
string response = args.DataRow["Captcha"];
string script = "page.verifyCallback('" + response + "');";
// call ClientScript from existing page instance
page.ClientScript.RegisterStartupScript(page.GetType(), "page.verifyCallback", script, true);
return CustomScriptReturn.Empty();
}
Связанная проблема: