【问题标题】:AJAX call not returning JSON object from WebMethodAJAX 调用未从 WebMethod 返回 JSON 对象
【发布时间】:2016-07-09 12:35:17
【问题描述】:

我能够让它工作(成功回调)。

但我得到的回应是 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!")
    }
 });
}

我在警报中收到“未定义的成功”。 “data”是整个 html 文档,而不是“Lottery”对象。

Create WebMethodLottery 类:

[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 作为响应。

【问题讨论】:

  • 提示:抱怨反对票可能只会带来更多反对票。
  • 我删除了它。你不能帮忙,而不是这种不友好的待遇吗?也许你对一个合法问题的否决真的会帮助我。谢谢。
  • 我认为它不起作用,“整个文档”可能是 404 或 500 http 响应。你真的看data的内容了吗?
  • html 中有什么?我试图弄清楚你是否有自定义错误,你甚至没有点击 webmethod。
  • 200 响应仅表示生成并发送了响应。这并不意味着它是您期望的响应。在web方法中放一个断点,看看是否命中。

标签: c# json ajax webmethod


【解决方案1】:

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

首先:您必须更正内容类型标头。它应该是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 作为请求类型。但是,这只是一个假设。试一试;-)

【讨论】:

  • 我尝试了你所说的一切,但没有成功。问题似乎是 WebMethod 从未被击中。 “ScriptManager”存在于 default.aspx
  • 太糟糕了 :( 并行启动 fiddler 以拦截 http 流量并查看是否提供任何其他提示可能是个好主意。
  • 我只是将 WebMethod 名称更改为某个随机名称,并将 url (/Create) 保留在 AJAX 中。我仍然得到整个 HTML。
  • 很遗憾没有。使用最简单的数据(只是一个字符串),我仍然可以获得整个文档。我有 ScriptManager。回调成功。我错过了什么?我不敢相信我被困在这。这是 HTML:pastebin.com/PL4HfSTH
【解决方案2】:

我们不知道为什么它不适合您,但也许您可以尝试另一种方法。在我看来,[WebMethod] 非常老套,而且显然比需要的更复杂。您可以将 WebAPI 服务添加到您的项目中,但如果您想坚持使用“老派”网络表单,那么您可以将 IHttpHandler 实现为一个“网络服务”的 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;
            }
        }
    }
}

【讨论】:

    【解决方案3】:

    **旧代码**

    $.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!")
            }
         });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      相关资源
      最近更新 更多