2017-01-18 6 views
0

json配列に文字列としてオブジェクトを渡そうとしていますが、Internal Server Errorがあります。json配列をWebMethodに渡す

メソッド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> 

答えて

2

まずの一般的なリストに変換したい、あなたはprocessDetailsオブジェクトを必要としない、あなたは、単に配列に、あなたのオブジェクトを追加することができます。

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

var processDetails = []; 

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

そして、getDataに文字列化しない配列を渡しますgetDataに行うためのの

いくつかの変更:

    0: dataType

  • jsonには ViewChartsであなたの data

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

いくつかの変更を文字列化設定し

  • foreach (ProcessDetail processDetail in processDetails) 
    { 
        // processDetail.StartDate 
        // processDetail.EndDate 
    } 
    
    :あなたは、直接あなたのリストのあなたのProcessDetailオブジェクトにアクセスすることができますList<ProcessDetail>

    public static string GetDurations(List<ProcessDetail> processDetails) 
    

としてごパラメータtextを設定し

  • 関連する問題