C# - jquery ajax发布的params没有传递给服务器

时间:2016-06-05 09:09:32

标签: c# jquery ajax

我在客户端有这个简单的ajax请求:

var name = $("#txtNewsletterName");
var email = $("#txtNewsletterEmail");

$.ajax({
    url: "/Handlers/Handler.ashx",
    contentType: "application/json; charset=utf-8",
    type: "POST",
    dataType: "json",
    data: {
        op: "register_to_newsletter",
        name: name.val(),
        email: email.val()
    },
    async: true
});

和C#服务器端的代码:

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "application/json";
    switch (context.Request["op"])
    {
        case "register_to_newsletter":
            string recipientName = context.Request["name"].Trim();
            string recipientEmail = context.Request["email"].Trim();
            break;
        default:
            break;
    }
}

问题是来自请求的数据未传递到服务器,因此context.Request["op"]context.Request["name"]context.Request["email"]为空。

我还检查了context.Request.Form.AllKeys及其string[0] 很明显,数据无法到达服务器。

检查Chrome调试器中的“网络”标签时,我发现有2个请求已发送,因此我已从Chrome调试器添加了网络数据的屏幕截图:

  1. request #1
  2. request #2

4 个答案:

答案 0 :(得分:2)

发生了重定向,似乎正在丢弃数据。

如果查看第二个屏幕截图,您会看到GET HTTP 200,但数据不再在请求中。

重定向是从"/Handlers/Handler.ashx""/handlers/handler.ashx"。也许在web.config中有一个urlrewrite强制执行小写网址,并且如果它与大写字符匹配则进行重定向?

如果您将网址更改为全部小写怎么办:

url: "/handlers/handler.ashx",

并删除co​​ntentType设置:

contentType: "application/json; charset=utf-8",

因为您没有反序列化服务器上​​的数据,但希望将其作为默认的contentType application/x-www-form-urlencoded; charset=UTF-8发送。 dataType 用于响应, contentType 用于请求。

答案 1 :(得分:0)

尝试更改数据:

  data: '{"op":"register_to_newsletter","name":"' + name.val() + '","email" :"' + email.val() + '"}'

并且还使用:

context.Request.Form["op"];

答案 2 :(得分:-1)

为什么不开始使用正确的数据模型?

不要使用HTTPContext,而是将输入参数作为要接收的数据的模型。那你就不会有任何问题。

答案 3 :(得分:-1)

在发送之前对您的对象进行字符串化,就像这样

data: JSON.stringify({
        "op": "register_to_newsletter",
        "name": name.val(),
        "email": email.val()
    }),

所以完整的代码应该是这样的

var name = $("#txtNewsletterName");
var email = $("#txtNewsletterEmail");

$.ajax({
    url: "/Handlers/Handler.ashx",
    contentType: "application/json; charset=utf-8",
    type: "POST",
    dataType: "json",
    data: JSON.stringify({
        "op": "register_to_newsletter",
        "name": name.val(),
        "email": email.val()
    }),
    async: true
});