javascript - 将 json 数组传递给 WebMethod

标签 javascript jquery json c#-4.0 webmethod

我尝试将对象作为字符串传递给 json 数组,但出现内部服务器错误

方法 GetServerTime 正在运行。

我想将对象数组传递到服务器并将其转换为 ProcessDetail 的通用列表

public class ProcessDetail
{
    public DateTime? StartDate {get;set;}
    public DateTime? EndDate {get;set;}
}

//Web Methods
[WebMethod]
public static string GetServerTime()
{
    return DateTimeHelper.AppDateTime.ToString(CultureInfo.CurrentCulture);
}

[WebMethod]
public static string GetDurations(string text)
{
    List<ProcessDetail> details = DeSerialize<ProcessDetail>(text);
    return string.Empty;
}

public static List<T> DeSerialize<T>(string input)
{
    var serializer = new DataContractJsonSerializer(typeof(List<T>));

    using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(input)))
    {
        return (List<T>)serializer.ReadObject(ms);
    }
}

// Javascirpt
<script>
    function DateChanged() {
        var grid = document.getElementById('<%= gvProcessMonitoring.ClientID %>');
        var servertime = getData('<%= ResolveUrl("ViewCharts.aspx/GetServerTime") %>', {});
        alert(servertime);

        var processDetails = {
            processDetail: []
        };

        if (grid.rows.length > 0) {
            for (var i = 1; i < grid.rows.length; i++) {
                var txtStartDate = grid.rows[i].getElementsByClassName('grdtxtStartDate')[0];
                var txtEndDate = grid.rows[i].getElementsByClassName('grdtxtEndDate')[0];

                processDetails.processDetail.push({
                    "StartDate": "'" + txtStartDate.value + "'",
                    "EndDate": "'" + txtEndDate.value + "'"
                });
            }

            // This is giving internal server error.I have tried without stringify.
            var serverData = getData('<%= ResolveUrl("ViewCharts.aspx/GetDurations") %>', JSON.stringify(processDetails));
        }
    }

    function getData(dataUrl, dataString) {
        var jsonObject;

        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: dataUrl,
            data: dataString,
            async: false,
            cache: false,
            timeout: 30000,
            success: function (data) {
                $(".loadingdiv").remove();
                jsonObject = data.d;
            },
            error: function (result) {
                debugger;
                $(".loadingdiv").remove();
                alert("Unexpected error");
            }
        });

        return jsonObject;
    }
</script>

最佳答案

首先,您不需要 processDetails对象,您可以简单地将对象添加到数组中:

var processDetails = [];

for (var i = 1; i < grid.rows.length; i++) {
    // [...]
    var processDetail = { StartDate: txtStartDate.value, EndDate: txtEndDate.value };
    processDetails.push(processDetail);
}

然后,传递给getData数组未字符串化:

var serverData = getData('<%= ResolveUrl("ViewCharts.aspx/GetDurations") %>', processDetails);

getData 中需要进行一些更改:

  • 设置dataTypejson
  • 将您的 data 字符串化

    dataType: "json",
    data: JSON.stringify({ processDetails: dataString })
    

ViewCharts 中的一些更改:

  • 设置您的参数text作为List<ProcessDetail>

    public static string GetDurations(List<ProcessDetail> processDetails)
    

然后您可以直接访问您的ProcessDetail列表中的对象:

foreach (ProcessDetail processDetail in processDetails)
{
    // processDetail.StartDate
    // processDetail.EndDate
}

关于javascript - 将 json 数组传递给 WebMethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41711869/

相关文章:

json - 无法在字符串内过滤值

java - Jackson Json Parser-如何处理未找到值的异常

javascript - Twitter Typeahead 自定义模板 - 让默认示例正常工作

javascript - 在 Chrome 中点击时 polymer 纸对话框不显示

javascript - 在完成加载之前如何制作图像,AJAX jQuery

javascript - jQuery/PHP 表单提交意外行为

json - 编码 JSON 时如何内联字段?

javascript - 检测微信二维码是否被扫描

javascript - 如何让按钮显示它在 javascript 中被点击的次数?

javascript - 如何检查选择器是否有qtip?