2012-12-30 41 views
17

Tôi có lời gọi jQuery AJAX sau đây tới trang ASP.Net.jQuery AJAX Gọi để đăng dữ liệu lên trang ASP.Net (không Nhận nhưng POST)

   $.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'); 


       } 
      }); 

Khi tôi cố gắng truy xuất từ ​​đối tượng Yêu cầu, dữ liệu đã đăng, nó không hiển thị. Mã trang aspx của tôi như sau. Tôi đang gửi từng dữ liệu được đăng ở định dạng Json đến trang, nhưng nó không hiển thị trong mã phía sau trang. Có một số cài đặt bổ sung trong cuộc gọi jQuery ajax mà tôi bị thiếu không?

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"]; 
    } 

UPDATE 1: câu trả lời của Stephen là cách tiếp cận tốt nhất để này, đặc biệt là cách tiếp cận mà không ProcessRequest. Tuy nhiên, tôi đã tìm thấy một mẹo nhỏ cho phép dữ liệu được đăng lên ASP.Net theo cách thông thường như Yêu cầu ["vendorId"] vv. Để cho phép đăng dữ liệu từ bất kỳ yêu cầu ajax jQuery nào, bạn chỉ cần chắc chắn rằng 2 điểm sau đây được áp dụng cho jQuery của bạn gọi ajax:

  1. các content-type nên được gạt ra khỏi cuộc gọi ajax jQuery của bạn Hoặc nếu bạn muốn bao gồm nó sau đó nó nên không được thiết lập đến "application/json; charset = utf-8" nhưng để "application/x-www-form-urlencoded; charset = UTF-8". Loại nội dung, theo sự hiểu biết của tôi là nói cho trang ASP.Net loại dữ liệu đang được gửi và không phải là loại dữ liệu được mong đợi của trang.
  2. Phần dữ liệu của jQuery ajax không được có tên dữ liệu được đính kèm trong dấu ngoặc kép. Vì vậy, dữ liệu: {"venorId": "AD231", "businessUnit": "123"} phải được thay thế bằng dữ liệu: {vendorId: "AD231", businessUnit: "123"}. Trong ví dụ này, tên dữ liệu là vendorId và businessUnit, có thể được truy cập trong mã ASP.Net của bạn bằng cách sử dụng cú pháp ASP.Net thông thường như Request ["vendorId"] và Request ["businessUnit"].
+0

Tôi cũng đã thử cách này, mọi thứ không hiệu quả với tôi. Ai giúp tôi với. – user1120998

Trả lời

30

Lựa chọn 1. Giữ mã phía máy chủ của bạn cùng

Đầu tiên loại bỏ các kendo.stringify. Sau đó, một trong hai loại bỏ các contentType hoặc thay đổi nó để ...

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

... hoặc thay đổi cuộc gọi $ .ajax của bạn như thế này:

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

Lựa chọn 2. Thay đổi POST để GET

như thế này

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

này sẽ truyền dữ liệu của bạn thông qua Q ueryString. Nếu bạn loại bỏ các cuộc gọi kendo.stringify bạn sẽ truy cập vào tất cả các giá trị như thế này:

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

Tùy chọn 3. Sử dụng ban đầu của bạn $ .ajax gọi

Nếu bạn sử dụng $ .ajax ban đầu của bạn , sau đó áp dụng:

Yêu cầu.Params nhận được "bộ sưu tập kết hợp các mục QueryString, Form, Cookies và ServerVariables". - this link

Bạn không làm việc với bất kỳ công cụ nào trong số này. Thay vào đó, bạn cần truy cập Request.InputStream.

Dưới đây là cách bạn có thể làm điều đó:

Tạo lớp ở phía máy chủ ánh xạ tới đối tượng JSON được yêu cầu, ví dụ:

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; } 
} 

Chuyển đổi yêu cầu.InputStream thành loại đó, sau đó bạn có thể sử dụng.

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(); 
} 
+2

Stephen - Cảm ơn. Bạn là một thiên tài. Tôi hy vọng tôi có thể cung cấp cho bạn một triệu điểm cho câu trả lời này. Điều đó mang lại cho tôi những gì tôi cần. – Sunil

+0

Stephen - Nhưng nếu tôi chỉ thay thế loại: "POST" theo loại: "Nhận", sau đó dữ liệu được đăng lên phần tử đầu tiên của Request.Params [0] mặc dù thông số đó không có tên. Vì vậy, có được như bài viết cho các trang aspx? – Sunil

+0

Stephen - Tại sao một loại: Nhận dữ liệu tôi gửi trong dữ liệu: ....? – Sunil

Các vấn đề liên quan