【问题标题】:jquery problem with sending json data to ASP.NET WebMethod将 json 数据发送到 ASP.NET WebMethod 的 jquery 问题
【发布时间】:2011-05-26 15:17:27
【问题描述】:

我已阅读有关此问题的所有问题,但没有设法解决...

分数类:

public class Score
{
    // default constructor
    public Score()
    { }

    public int TraitID { get; set; }

    public double TraitScore { get; set; }
}

ASPX Web 方法:

    [WebMethod]
    public static bool Test(List<Score> scores)
    {
        return true;
    }

jQuery 代码:

            var scoresList = [{"TraitID":1,"TraitScore":2}, {"TraitID":2,"TraitScore":5}];

            $.ajax({
                type: "POST",
                url: "Tryouts.aspx/Test",
                data: "{'scores':" + JSON.stringify(scoresList) + "}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    if (response.d == true) {
                        alert("success!!!!!");
                    }
                    else {
                        alert("problem!!!!!!!!!");
                    }
                },
                error: function () {
                    alert("ERROR");  
                }
            });

我不断收到错误:

{"Message":"Cannot convert object of type \u0027System.String\u0027 to type
\u0027System.Collections.Generic.List`1[BusinessLogicLayer.Score]\u0027","StackTrace":"   at
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type,
JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n   at
System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type,
JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)\r\n   at
System.Web.Script.Services.WebServiceMethodData.StrongTypeParameters(IDictionary`2 rawParams)\r\n
at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target,
IDictionary`2 parameters)\r\n   at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext
context, WebServiceMethodData methodData, IDictionary`2 rawParams)\r\n   at
System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context,
WebServiceMethodData methodData)","ExceptionType":"System.InvalidOperationException"}

谢谢!!!

【问题讨论】:

    标签: jquery asp.net ajax json


    【解决方案1】:

    我在 Web 方法中将自定义对象数组传递到 List 中,它工作得很好。

    我猜你有一个小的 JSON 格式问题,因为属性名称周围有引号。尝试将您的对象更改为此:

    var scoresList = [{TraitID:1, TraitScore:2}, {TraitID:2, TraitScore:5}];
    

    并将您的数据线更改为:

    data: JSON.stringify({ scores : scoresList }),      
    

    希望对你有帮助……

    更新:工作示例...

    <script type="text/javascript">
    $(function () {
    
        var scoresList = [{ TraitID: 1, TraitScore: 2 }, { TraitID: 2, TraitScore: 5}];
    
        $.ajax({ type: "POST",
            url: "Tryouts.aspx/Test",
            data: JSON.stringify({ scores: scoresList }),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response) {
                if (response.d == true) {
                    alert("success!!!!!");
                } else {
                    alert("problem!!!!!!!!!");
                }
            },
            error: function (xhr) {
                alert("ERROR");
            }
        });
    
    });
    </script>
    

    这是代码隐藏:

    public class Score
    {    // default constructor    
        public Score() { }
        public int TraitID { get; set; }
        public double TraitScore { get; set; }
    }
    
    [WebMethod]
    public static bool Test( List<Score> scores )
    {
        return true;
    }
    

    【讨论】:

    • 另一个问题:如何动态构建scoresList?这是我的代码: $(".traits").each(function () { var selectedRadio = $(this).children('input[type=radio]:checked'); var score = selectedRadio.val(); if (score != undefined) { allScores += '{ TraitID: ' + selectedRadio.attr("name").replace('trait', '') + ', Score: ' + score + '}, '; } }); var scoreList = '[' + allScores.slice(0, -2) + ']';应该如何看待 $.ajax 中的数据?
    • 这确实应该是一个单独的问题,但这里有:字符串allScores 不需要。像这样将score 对象添加到'scoresList' var 中:` $(".traits").each(function () { var selectedRadio = $(this).children('input[type=radio]:checked' ); if (score != undefined) { scoresList.push( { TraitID: selectedRadio.attr("name").replace('trait', ''), Score: selectedRadio.val() }); } }); `
    • var scoreList = []; $(".traits").each(function (){ var selectedRadio = $(this).children('input[type=radio]:checked'); var score = selectedRadio.val(); if (score != undefined) { scoresList.push({ TraitID: selectedRadio.attr("name").replace('trait', ''), Score: score }); } }); $.ajax({ type: "POST", url: "Tryouts.aspx/Test", data: JSON.stringify({ scores: scoresList }), contentType: "application/json; charset=utf-8", dataType: “json”,成功:函数(响应){ if (response.d == true) {alert("success!!!!!");} else { alert("problem!!!!!!!!!" ); } }, 错误:函数 () { alert("ERROR"); } });
    • OMG Shane,我(以及其他许多人)花了大约 4 个小时在谷歌上搜索复杂的解决方案。你把它钉牢了,最小限度地和紧密地结合在一起。太棒了。
    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多