jQuery AJAX - вызов для публикации данных на странице ASP.Net (не Get, а POST).

У меня есть следующий jQuery AJAX-вызов на страницу ASP.Net.

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


                }
            });

Когда я пытаюсь извлечь из объекта запроса опубликованные данные, он не отображается. Мой код страницы aspx, как показано ниже. Я отправляю на страницу все опубликованные данные в формате Json, но они не отображаются в коде позади страницы. Есть ли какая-то дополнительная настройка в jQuery ajax call, которую мне не хватает?

   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"] и т. Д. Чтобы включить такую ​​отправку данных из любого jjuery-запроса ajax, вам просто нужно убедитесь, что следующие 2 пункта применяются к вашему вызову jQuery ajax:

  1. Тип содержимого должен быть исключен из вашего вызова jQuery ajax. Или, если вы хотите включить его, он должен быть установлен не на "application/json; charset=utf-8", а на "application/x-www-form-urlencoded".; charset=UTF-8". Тип содержимого, как я понимаю, говорит странице ASP.Net тип отправляемых данных, а не тип ожидаемых данных страницы.
  2. Часть данных jQuery ajax не должна содержать имен данных, заключенных в кавычки. Поэтому данные: {"venorId":"AD231","businessUnit":"123"} должны быть заменены данными: {vendorId:"AD231",businessUnit:"123"}. В этом примере имена данных являются vendorId и businessUnit, к которым можно получить доступ в своем кодовом компоненте ASP.Net, используя обычный синтаксис ASP.Net, такой как Request["vendorId"] и Request["businessUnit"].

1 ответ

Решение

Вариант 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, Cookies и 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();
}
Другие вопросы по тегам