2012-12-30 9 views
17

Mam następujące wywołanie jQuery AJAX do strony ASP.Net.jQuery AJAX Zaproszenie do opublikowania danych na stronie ASP.Net (nie Uzyskaj 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'); 


       } 
      }); 

Kiedy próbuję pobrać z obiektu Request, opublikowanych danych, nie pojawia się. Mój kod strony aspx jest poniżej. Przesyłam każdą z opublikowanych danych w formacie Json do strony, ale nie pojawia się ona w kodzie strony. Czy jest jakieś dodatkowe ustawienie w wywołaniu ajax jQuery, którego mi brakuje?

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: odpowiedź Szczepana jest najlepszym podejściem do tego, zwłaszcza że podejście robi ProcessRequest. Jednak znalazłem małą sztuczkę, która pozwoli na publikowanie danych w ASP.Net w zwykły tradycyjny sposób, np. Request ["vendorId"] itd. Aby włączyć takie wysyłanie danych z dowolnego żądania ajax jQuery, wystarczy po prostu upewnij się, że poniższe 2 punkty są stosowane do jQuery ajax rozmowy:

  1. The-typu treści powinny być pozostawione na swoim jQuery wywołanie ajax Albo jeśli chcesz umieścić go to powinno nie można ustawić do "application/json; charset = utf-8", ale do "application/x-www-form-urlencoded; charset = UTF-8". Typ zawartości, zgodnie z moim rozumieniem, informuje stronę ASP.Net o typie danych, które są wysyłane, a nie o typie danych oczekiwanych od strony.
  2. Część danych jQuery ajax nie powinna zawierać nazw danych zawartych w cytatach. Zatem dane: {"venorId": "AD231", "businessUnit": "123"} należy zastąpić danymi: {vendorId: "AD231", businessUnit: "123"}. W tym przykładzie nazwy danych to vendorID i businessUnit, do których można uzyskać dostęp za pomocą kodu ASP.Net za pomocą zwykłej składni ASP.Net, takich jak Request ["vendorId"] i Request ["businessUnit"].
+0

Jestem również wypróbowany w ten sposób, wszystko nie działa dla mnie. Czy ktoś może mi pomóc. – user1120998

Odpowiedz

30

Wariant 1. przechowywać kodu po stronie serwera to samo

Najpierw wyjąć kendo.stringify. Wtedy albo usunąć contentType lub zmienić go do ...

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

... lub zmienić wywołanie $ .ajax do tego:

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

wariant 2. Zmień POST na GET

Ci się to

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

Przepuszcza danych przez Q ueryString. Jeśli usunąć wywołanie kendo.stringify by uzyskać dostęp do wszystkich wartości tak:

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

Opcja 3. Użyj oryginalnego $ .ajax wywołania

Jeśli używasz oryginalnego $ .ajax , następnie obowiązuje:

Wniosek.Params otrzymuje "połączoną kolekcję elementów QueryString, Form, Cookies i ServerVariables". - this link

Nie pracujesz z żadną z nich. Zamiast tego należy uzyskać dostęp do Request.InputStream.

Oto jak można to zrobić:

Tworzenie klasy po stronie serwera, który mapuje do żądanego obiektu JSON, na przykład

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

Konwersja Request.InputStream do tego typu, a następnie można z niego korzystać.

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 - Dzięki. Jesteś geniuszem. Mam nadzieję, że mogę dać ci milion punktów za tę odpowiedź. To daje mi to, czego potrzebuję. – Sunil

+0

Stephen - Ale jeśli po prostu zastąpię typ: "POST" według typu: "Get", dane zostaną wysłane do pierwszego elementu Request.Params [0], chociaż ten parametr nie ma nazwy. Czy jest to Post jak Post dla stron aspx? – Sunil

+0

Stephen - Dlaczego jest typ: Wysyłaj dane, które wysyłam w danych: ....? – Sunil

Powiązane problemy