AJAX调用返回页面HTML /没有命中页面方法是ASP.Net(没有MVC或Json)

时间:2013-10-10 18:27:34

标签: asp.net ajax

我正在为我当前的公司更新一个工具,该工具根据选择的选项提供基本的产品布局文档。最近似乎某种类型的机器人定期点击工具箱,经过与公司的一些讨论,我们构建了工具箱,我们决定将ReCaptcha工具添加到页面中。

工具箱的设置方式是ASP.net,不使用Json或MVC(工具箱是一个公平的几年,在我加入团队之前很久就建立了)。添加ReCaptcha工具不是问题,我没有使用window.onload函数和使用他们的指令的插件。这些都是在options.aspx页面上完成的,ReCaptcha调用的代码在options.aspx.cs页面中。

要获得此代码,我正在尝试进行AJAX调用,通常会提交表单。

问题:每个AJAX调用都会返回页面的HTML,并且当我有一个断点时,页面方法(VerifyReCaptcha)不会触发。我需要它来调用将执行所有列表的方法,然后简单地传回一个简单说明它是否成功的字符串。我输入的dataType或contentType(如果有的话),或者我将其作为POST或GET运行似乎并不重要。

以下是调用ajax调用函数的按钮的代码。

    <input type="button" id="DownloadLayoutButton" value="Download Layout" class="navigationButton" style="width: 200px; height: 24px;" />

这是被调用的函数。

    $("#DownloadLayoutButton").click(function () {
        $.ajax(
        {
            url: "options.aspx/VerifyReCaptcha",
            dataType: "text",
            data: {
                challenge: Recaptcha.get_challenge(),
                response: Recaptcha.get_response()
            },
            type: "POST",
            success: function (result) {
                if (result == "Success") {
                    alert("Success!");
                else
                    alert("ReCaptcha entry was incorrect!");
            },
            error: function (request, status, error) {
                alert("Error!");
            }
        });
    });

此代码似乎永远不会出现在options.aspx.cs页面上的VerifyReCaptcha()方法中,方法如下。如上所述,我已经测试并确认此功能可单独使用。以前我让它返回一个布尔值但由于ajax不能与布尔值一起使用,我根据结果将其更改为“Success”或“Failure”。

    [WebMethod]
    public static string VerifyReCaptcha(string challenge, string response)
    {
        try
        {
            string PRIVATE_KEY = "MY_KEY_HERE";
            string remoteip = HttpContext.Current.Request.UserHostAddress;

            WebRequest request = WebRequest.Create("http://www.google.com/recaptcha/api/verify");

            byte[] dataBytes = System.Text.Encoding.UTF8.GetBytes(String.Format("privatekey={0}&remoteip={1}&challenge={2}&response={3}", PRIVATE_KEY, remoteip, challenge, response));

            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = dataBytes.Length;

            request.GetRequestStream().Write(dataBytes, 0, dataBytes.Length);

            String resultString = String.Empty;
            String errorString = String.Empty;

            using (StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream()))
            {
                resultString = sr.ReadLine();
                errorString = sr.ReadLine();
            }

            Boolean b;
            b = Boolean.TryParse(resultString, out b) && b;

            if (b)
                return "Success";
            else
                return "Failure";
        }
        catch (Exception)
        {
            return "Failure";
        }
    }

aspx页面使用以下来源。

    <script type="text/javascript" src="JS/jquery-1.3.2.min.js"></script>
    <script type="text/javascript" src="JS/jquery-validate/jquery.validate.js"></script>
    <script type="text/javascript" src="http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script>

2 个答案:

答案 0 :(得分:2)

您的ASP.NET AJAX页面方法必须是static

你有:

public virtual string VerifyReCaptcha()

需要:

public static virtual string VerifyReCaptcha()

注意:请阅读Why do ASP.NET AJAX page methods have to be static?以获取更多信息。

答案 1 :(得分:0)

据我了解,asp.net WebMethods期望在JSON中发布数据。 在您的JavaScript jQuery Ajax调用中使用dataType: "json"而不是dataType: "text"

我还添加contentType: "application/json; charset=utf-8"作为另一种选择。

如果未找到所需的格式正确的数据,则不会调用WebMethod。