20

我对 ASP.Net 页面进行了以下 jQuery AJAX 调用。

             $.ajax({
                async: true,
                type: "POST",
                url: "DocSummaryDataAsync.aspx", //"DocSummary.aspx/GetSummaryByProgramCount",
                contentType: "application/json; charset=utf-8",
                data: kendo.stringify({ vendorId: supplierId, businessUnit: busUnit, productSegmentId: prodSegmentId, programId: progId, productManagerId: prodManagerId, companyIds: compIds, expired: exp.toString(), requestType: 'TotalCount' }),
                success: function (msg) {
                    // alert('in success of getcount');

                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    // alert('in failure of getcount');


                }
            });

当我尝试从 Request 对象中检索发布的数据时,它没有显示出来。我的 aspx 页面代码如下。我将 Json 格式的每个发布数据发送到页面,但它没有显示在页面的代码隐藏中。jQuery ajax 调用中是否有一些我缺少的额外设置?

   protected void Page_Load(object sender, EventArgs e)
    {
        Response.ContentType = "application/json";

        string requestType = Request.Params["requestType"];


        //populate variables from posted data
        string vendorId = Request.Params["vendorId"];
        string businessUnit = Request.Params["businessUnit"];
        string productSegmentId = Request.Params["productSegmentId"];
        string commitmentProgramId = Request.Params["programId"];
        string productManagerId = Request.Params["productManagerId"];
        string companyIds = Request.Params["companyIds"];
        string expired = Request.Params["expired"];
     }

更新1: 斯蒂芬的答案是最好的方法,尤其是执行ProcessRequest的方法。但是,我确实找到了一个小技巧,它允许以通常的传统方式将数据发布到 ASP.Net,例如 Request["vendorId"] 等。要从任何 jQuery ajax 请求中发布此类数据,您只需要确保将以下 2 点应用于您的 jQuery ajax 调用:

  1. 内容类型应该被排除在你的 jQuery ajax 调用之外,或者如果你想包含它,那么它不应该设置为"application/json; charset=utf-8" 而是 "application/x-www-form-urlencoded ; 字符集=UTF-8"。根据我的理解,内容类型是告诉 ASP.Net 页面正在发送的数据类型,而不是页面预期的数据类型。
  2. jQuery ajax 的数据部分不应将数据名称括在引号中。所以 data: {"venorId":"AD231","businessUnit":"123"} 应该替换为 data: {venorId:"AD231",businessUnit:"123"}。在此示例中,数据名称是 vendorId 和 businessUnit,可以使用通常的 ASP.Net 语法(如 Request["vendorId"] 和 Request["businessUnit"])在 ASP.Net 代码隐藏中访问它们。
4

1 回答 1

32

选项 1.保持服务器端代码相同

首先删除kendo.stringify。然后删除 contentType 或将其更改为...

"application/x-www-form-urlencoded; charset=utf-8" 

...或将您的 $.ajax 调用更改为:

$.post('DocSummaryDataAsync.aspx', { vendorId: supplierId, businessUnit: busUnit, productSegmentId: prodSegmentId, programId: progId, productManagerId: prodManagerId, companyIds: compIds, expired: exp.toString(), requestType: 'TotalCount' }, function (data) { });

选项 2.将 POST 更改为 GET

像这样

$.ajax({
async: true,
type: "GET",
etc.

这将通过 QueryString 传递您的数据。如果您删除kendo.stringify调用,您将访问所有值,如下所示:

string vendorId = Request.QueryString[0];
string businessUnit = Request.QueryString[1];
etc.

选项 3.使用您原来的 $.ajax 调用

如果您使用原始 $.ajax,则适用以下内容:

Request.Params 获得“QueryString、Form、Cookie 和 ServerVariables 项的组合集合”。-这个链接

您没有与其中任何一个一起工作。相反,您需要访问 Request.InputStream。

您可以这样做:

在服务器端创建一个映射到请求的 JSON 对象的类,例如

public class MyClass
{
    // The type (int or string) should probably correspond to the JSON
    public int vendorId { get; set; }
    public string businessUnit { get; set; }
    public string productSegmentId { get; set; }
    public string programId { get; set; }
    public string productManagerId { get; set; }
    public string companyIds { get; set; }
    public string expired { get; set; }
    public string requestType { get; set; }
}

将 Request.InputStream 转换为该类型,然后您就可以使用它了。

public void ProcessRequest()
{
    System.IO.Stream body = Request.InputStream;
    System.Text.Encoding encoding = Request.ContentEncoding;
    System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding);
    string json = reader.ReadToEnd();
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    MyClass myclass = (MyClass)serializer.Deserialize(json, typeof(MyClass));
    int vendorId = myclass.vendorId;
    string requestType = myclass.requestType;
    // etc...
}

protected void Page_Load(object sender, EventArgs e)
{
    ProcessRequest();
}
于 2012-12-30T22:19:36.867 回答