AJAX调用不从WebMethod返回JSON对象

时间:2016-07-09 12:35:18

标签: c# json ajax webmethod

我能够使它成功(成功回调)。

但我得到的回应是default.aspx的整个HTML

AJAX

function CreateLottery(lottery) {
debugger; // 'lottery' comes with the properties of the Lottery class
$.ajax({
    type: 'POST',
    url: 'default.aspx/Create',
    data: JSON.stringify({ data: lottery }),
    dataType: 'text',
    success: function (data, status) {
        alert(data.TotalValue + " " + status) //"undefined success"
    },
    error: function () {
        alert("error!")
    }
 });
}

我得到了未定义的成功"在警报中。 " 数据"是整个HTML文档,而不是" 彩票"对象

创建 WebMethod 彩票类:

[WebMethod]
public static Lottery Create(Lottery lottery)
{
    return lottery;
}
public class Lottery
{
    public string TotalValue { get; set; }
    public string Players { get; set; }
}

我无法弄清楚发生了什么,WebMethod返回的是与收到的完全相同的对象,我怎样才能在成功回调中访问它?

编辑:WebMethod没有被点击。 " ScriptManager"存在于default.aspx中, EnablePageMethods 设置为 true 。如果我将WebMethod名称(Create)更改为任何内容并在AJAX中保留/创建url仍然会获得整个default.aspx HTML作为响应。

3 个答案:

答案 0 :(得分:0)

我认为你必须考虑两件事:

首先:您必须更正内容类型标题。它应该是application/json而不是text

另一个问题是[WebMethod]需要XML。它没有开箱即用的JSON。

要让您的WebMethod返回格式为JSON的内容,您必须另外将其装饰为ScriptMethod。 该属性允许您将响应的格式指定为JSON。

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static Lottery Create(Lottery lottery)
{
    // ...
}

嗯,但有一件事我不确定:虽然您可以指定ResponseFormat,但我找不到指定RequestFormat的方法。我假设当您将JSON定义为响应类型时,它接受JSON作为请求类型。但是,这只是一个假设。试一试; - )

答案 1 :(得分:0)

我们不知道为什么它不适合你,但也许你可以尝试另一种方法。 [WebMethod]在我看来相当hacky,显然比需要的更复杂。您可以向项目添加WebAPI服务,但如果您想坚持使用“旧学校”Web表单,则可以将IHttpHandler实现为作为“Web服务”的ashx文件。请注意,.aspx页面也实现了IHttpHandler,但它们旨在返回HTML,而处理程序用于处理文件下载等通用请求,以及xml和json等数据。

使用Handler项目模板实现类似的功能,并使用ajax调用点击它:

using System.IO;
using System.Web;

namespace WebApplication1
{
    public class LotteryHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "application/json";

            using (var reader = new StreamReader(context.Request.InputStream))
            {
                string values = reader.ReadToEnd();

                //Use Newtonsoft to deserialize to Lottery type

                //do whatever with Lottery

                //Use Newtonsoft to serialize Lottery again (or whatever you want to return)

                context.Response.Write(your_serialized_object);

                //finish the response
                context.Response.Flush();
                HttpContext.Current.ApplicationInstance.CompleteRequest();
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

答案 2 :(得分:0)

**旧代码**

$.ajax({
    type: 'POST',
    url: 'default.aspx/Create',
    data: JSON.stringify({ data: lottery }),
    dataType: 'text',
    success: function (data, status) {
        alert(data.TotalValue + " " + status) //"undefined success"
    },
    error: function () {
        alert("error!")
    }
 });

**新代码**

请参阅此处的内容类型和数据类型更改

 $.ajax({
        type: 'POST',
        url: 'default.aspx/Create',
        data: JSON.stringify({ data: lottery }),
     contentType: "application/json; charset=utf-8",
       dataType: "json",
       success: function (data, status) {
            alert(data.TotalValue + " " + status) //"undefined success"
        },
        error: function () {
            alert("error!")
        }
     });