我能够使它成功(成功回调)。
但我得到的回应是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作为响应。
答案 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!")
}
});