Как я могу вызвать функцию 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();
}

Связанная проблема:

Ссылка на объект требуется для нестатического поля, метода или свойства 'System.Web.UI.Page.ClientScript.get'

Другие вопросы по тегам