jQuery 1.5 Передача строк и объекта в метод страницы .NET - PullRequest
0 голосов
/ 08 марта 2011

Я упростил свой код до простой передачи массива, но мне все равно не повезло
Когда я перешагиваю код и дохожу до точки запроса ajax

jsonText содержит:

[{"UserId":"8"},{"UserId":"9"},{"UserId":"5"},{"UserId":"13"},{"UserId":"6"},{"UserId":"11"}]  

и

jsonTextSerialized contains:  
"[{\"UserId\":\"8\"},{\"UserId\":\"9\"},{\"UserId\":\"5\"},{\"UserId\":\"13\"},{\"UserId\":\"6\"},{\"UserId\":\"11\"}]"  




function GetUserSchedules() {  
 var jsonText = $.toJSON(arrParams);  
  var jsonTextSerialized = Sys.Serialization.JavaScriptSerializer.serialize(jsonText);  
  $.ajax({  
    type: "POST",  
    url: "/myurl/jquery.aspx/GenerateUserSchedules",  
    data: "{'data':'" + jsonTextSerialized + "'}",  
    contentType: "application/json",  
    dataType: "json",  
    success: function () { alert('Made It!'); },  
    error: function (result) { alert(Failed: ' + result.responseText);   
  });  

Мой код имеет

[Serializable]  
public class User  
{  
  public int UserId { get; set; }  
}  

[System.Web.Script.Services.ScriptMethod]  
[System.Web.Services.WebMethod]  
public static void GenerateUserSchedules(User[] data)  
{  
  //do stuff  
} 

Текст ответа:
"Произошла ошибка при обработке запроса.", "StackTrace": "", "ExceptionType": ""}

Что я делаю не так?

МОЕ РЕШЕНИЕ С ПОМОЩЬЮ:

Спасибо всем за ваши усилия. Я не могу выразить благодарность за ваш вклад. Мне стыдно признаться, но я застрял на этом несколько дней.

Я вижу из всех ваших ответов, что есть разные способы подойти к этому. Мне нравится решение JSON.stringify лучше всего по двум причинам:

  1. устраняет опасность случайного опечатки, когда я добавляю параметры в запрос ajax.
  2. По словам Олега, это это более эффективный способ сериализации объекты данных

Вот как я решил решить эту проблему.

<script type="text/javascript">        
    var startDate;
    var endDate;
    var ddlViewSelectedItem;
    var ddlViewSelectedValue;
    var ddlOrgSelectedValue;
    var arrUsers= [];



    $(document).ready(function () {
        ddlViewSelectedItem = $('#<%=ddlView.ClientID %> option:selected').text();
        ddlViewSelectedValue = $('#<%=ddlView.ClientID %> option:selected').val();
        ddlOrgSelectedValue = $('#<%=ddlOrganization.ClientID %> option:selected').val();

        $.when(GetStartDate(), GetEndDate()) //these populate strt and end dates
            .then(function () {
                GetUserIDs();       // populates arrUsers
                GetUserSchedules();                                    
            })
            .fail(function () {
                failureAlertMsg();

            })
    });

    // Here I use JSON.stringify because it simplifies adding params. No messy single and/or double quote confusion. I love this. Must include json2.js from https://github.com/douglascrockford/JSON-js/blob/master/json2.js
    function GetUserSchedules() { 
        var jsonTextStringified = JSON.stringify({ data: arrParams, startDate: startDate, endDate: endDate, ddlViewSelectedItem: ddlViewSelectedItem, ddlViewSelectedValue: ddlViewSelectedValue, ddlOrgSelectedValue: ddlOrgSelectedValue }); 
        $.ajax({
            type: "POST",
            url: "/myurl/jquery.aspx/GenerateUserSchedules", // this is a call to a pagemethod, not a webservice, so .aspx is correct
            data: jsonTextStringified,
            contentType: "application/json",
            dataType: "json",
            success: function () { alert('Sweet! Made It!'); }
            ,
            error: function (result) { alert('Failed!: ' + result.responseText); }
        });
    }

Код:

[Serializable]
public class User
{
    public string UserId { get; set; }
}


[System.Web.Script.Services.ScriptMethod]
[System.Web.Services.WebMethod]
public static void GenerateUserSchedules(User[] data, string startDate, string endDate, string ddlViewSelectedItem, string ddlViewSelectedValue, string ddlOrgSelectedValue)
{
    //do cool stuff and eventually send data back
}

Еще раз спасибо за вашу помощь

Ответы [ 4 ]

1 голос
/ 08 марта 2011

Посмотрите на близкий ответ здесь , здесь или здесь .Многие люди допускали одинаковые ошибки.

  1. При инициализации объектов JavaScript вы можете использовать как кавычки, так и двойные кавычки, но в данных JSON допускаются только двойные кавычки.
  2. Вы должнынет времени делать руководство по сериализации JSON как {"{'startDate':'" + startDate + "', ... и не использовать старый $.toJSON плагин jQuery.Лучший способ - использовать функцию JSON.stringify из json2.js .Самая последняя версия веб-браузеров поддерживает функцию в собственном коде, поэтому она работает очень быстро.

Еще одна странная вещь - это путь "/myurl/jquery.aspx/GenerateUserSchedules".вместо "/myurl/jquery.asmx/GenerateUserSchedules" (asmx вместо aspx).

В вашем случае вы должны использовать

data: JSON.stringify({
    startDate: startDate,
    endDate: endDate,
    ddlViewSelectedItem: ddlViewSelectedItem,
    ddlViewSelectedValue: ddlViewSelectedValue,
    ddlOrgSelectedValue: ddlOrgSelectedValue
})

в случае использования type: "POST" и

data: {
    startDate: JSON.stringify(startDate),
    endDate: JSON.stringify(endDate),
    ddlViewSelectedItem: JSON.stringify(ddlViewSelectedItem),
    ddlViewSelectedValue: JSON.stringify(ddlViewSelectedValue),
    ddlOrgSelectedValue: JSON.stringify(ddlOrgSelectedValue)
}

, если вы решите использовать type: "GET".

Важно отправить данные для всех входных параметров веб-метода.По крайней мере, вам следует отправлять параметры со значением null в качестве входных данных (для объектов, допускающих значение NULL).

ОБНОВЛЕНО : В то время, когда вы переписали свой вопрос.Итак, теперь ответ на новую версию вашего вопроса.

Вы должны использовать

$.ajax({  
    type: "POST",  
    url: "/myurl/jquery.aspx/GenerateUserSchedules",  
    data: JSON.stringify({data: [
            {UserId:8},{UserId:9},{UserId:5},{UserId:13},{UserId:6},{UserId:11}]}),  
    contentType: "application/json",  
    dataType: "json",  
    success: function () { alert('Made It!'); },  
    error: function (result) { alert(Failed: ' + result.responseText);   
});

Причина проста.Поскольку у вас есть метод GenerateUserSchedules(User[] data) с входным параметром data, вы должны использовать JSON.stringify({data: yourData}) в качестве входа.Массив User объектов должен быть массивом с элементами {UserId:8} (или {'UserId':8} или {"UserId":8}), но не {UserId:"8"}.

1 голос
/ 08 марта 2011

Убедитесь, что имена и типы свойств json совпадают с параметрами веб-метода.Ваша переменная jsonText является массивом, и поэтому для веб-метода требуется свойство типа массива, чтобы принять его (как в примере, опубликованном Nikhil).

Так что, если вы использовали сигнатуру веб-метода в примере Nikhil ипользовательский объект пользователя, вам нужно сделать свойство data для вызова jjery ajax:

"{'startDate':'" + startDate + "', 'endDate':'" + endDate + "', 'ddlViewSelectedItem':'" + ddlViewSelectedItem + "', 'ddlViewSelectedValue':'" + ddlViewSelectedValue + "', 'ddlOrgSelectedValue':'" + ddlOrgSelectedValue + "','customObejct':" + jsonText + "}"
1 голос
/ 08 марта 2011

это может быть просто:

data: "{'data':'" + jsonTextSerialized + "'}",

изменить на

data: '{"data":"' + jsonTextSerialized + '"}',

И / ИЛИ изменить сторону клиента "UserId" на "UserID"

1 голос
/ 08 марта 2011

Есть несколько подходов для этого. Если ваше приложение случайно использует библиотеки MS Ajax, то все, что вам нужно сделать на стороне клиента, это

var jsonText = [{"UserId":"8"},{"UserId":"9"},{"UserId":"5"}];
var jsonTextSerialized = Sys.Serialization.JavaScriptSerializer.serialize(jsonText);

Затем вы можете использовать этот jsonTextSerialized с другими параметрами, которые вы должны отправить в свой код на стороне сервера. На стороне сервера вы можете иметь

public class User{
  public Int32 UserId{
    get;set;
  }
}
[System.Web.Script.Services.ScriptMethod]  
    [System.Web.Services.WebMethod]  
    public static void GenerateUserSchedules(string startDate, string endDate, string ddlViewSelectedItem, string ddlViewSelectedValue, string ddlOrgSelectedValue, User[] customObejct) 

Это должно автоматически сделать это для вас.

Если вы не используете MS Ajax, тогда получите JSON2.js отсюда

http://www.json.org/js.html

Вы можете использовать эту библиотеку для сериализации вашего объекта на стороне клиента. На стороне сервера все должно остаться без изменений.

Для более подробного руководства и информации также проверьте это

http://forums.asp.net/t/1388935.aspx

Надеюсь, это поможет!

Нихилу

ваш пользовательский объект должен теперь иметь объект

...