Gửi một mảng Date từ javascript lên server (ASP.NET)

Mình có 1 mảng Date:

var Data = [];

Và add phần tử vào

function Add(){
    for(var i=0;i<10;i++) Data.push(new Date());
}

Gửi đi:

$.ajax({
    url:'....',
    type:'post'
    datatype: 'json',
    data:{data:Data},
    success: funtion(){
        // đã success và chạy vào đây nhưng trên server không có dữ liệu
    }
});

Trên server có 1 method để nhận mảng này.
Mình đã thiết kế như này nhưng không chạy. Trong data không có gì

public JsonResult ProcData(DateTime[] data){...};
public JsonResult ProcData(List<DateTime> data){...};

Nhờ các anh em chỉ giáo :slight_smile:

thay vì dùng mảng bình thường, bạn dùng FormData để tạo dữ liệu gửi lên thử xem

2 Likes

Mình đã chuyển qua dùng thử FormData. Kết quả cũng không khá hơn tẹo nào @@.

Đối với những kiểu dữ liệu như int, string,… thì kiểu mảng thông thường và FormData đều hoạt động OK. Nhưng kiểu Date trong javascript và trên C# sử dụng DateTime để nhận thì hoàn toàn không hoạt động. List/Mảng nhận được hoàn toàn rỗng. :frowning:

Nếu truyền dữ liệu đơn thì lại hoạt động bình thường với Date / DateTime.

Thế thì thớt dùng giải pháp tạm thời là gửi timestamp vậy?

1 Like

Đành dùng tạm thế vậy :frowning:

bạn dùng như thế nào v? mình nghĩ là dùng FormData gửi lên vẫn được chứ nhỉ:

var formData = new FormData();
for(var i=0;i<10;i++) formData.append('date[]', new Date());
$.ajax({
    url:'....',
    type:'post'
    datatype: 'json',
    data: formData,
    success: funtion(){
      ...
    }
});

Mình test như thế này với FormData:

var formData = new FormData();
for(var i=0;i<10;i++){
    // gửi 2 loại dữ liệu để test cùng lúc
    formData.append("datearray",new Date());
    formData.append("stringarray","TEST");
}
$.ajax({
    url:'....',
    type:'post'
    datatype: 'json',
    contentType:false,
    processData:false,
    data: formData,
    success: funtion(){
      ...
    }
});

Trên C# khai báo một class chứa dữ liệu gửi lên:

public class FormDataModel{
    public List<DateTime> datearray{get;set;}  // cái này để nhận mảng date
    public List<string> stringarray{get;set;} // cái này để nhận mảng string
}

Hàm nhận:

public JsonResult ProcData(FormDataModel data){
    // đến đây thì data.stringarray nhận đủ 10 phần tử từ client gửi lên
    // tuy nhiên data.datearray khác null nhưng không có phần tử nào
    // ...
}

Nếu như thay thế kiểu dữ liệu của datearray trong FormDataMode thành cái khác, ví dụ int và bên dưới append int vào datearray thì nó hoạt động bình thường.

có thể do xử lý trong C#.
bạn check ở Dev Tool xem request có gửi dữ liệu params date lên không.

Date của C# và Date của JavaScript khác nhau, 2 kiểu khác nhau nên không thể gửi được.

Có 3 cách giải quyết, đều sử dụng biểu diễn trung gian:

  • Sử dụng date formatter chuyển về string chung, dạng: dd/MM/yy h:m:s (25/07/2018 09:06:09)
  • Truyền JSON { day: 25, month: 7, year: 2018, hour: 9, minute: 6, second: 9 }
  • Sử dụng số nguyên là số giây từ 01/01/1970 tới hiện tại: 1532484564914
2 Likes

Kiểu thủ công cắt nối chuỗi, hoặc timestamp như thế này thì mình làm được.
Mình đang muốn ngắn và đơn nhất có thể.
Điều lạ là nếu truyền đơn lẻ kiểu Date (js truyền thẳng object dạng Date và C# dùng DateTime để nhận) thì nó ăn hàng ngay. Nhưng mảng thì tạch.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?