01/10/2018, 16:47

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

Sáng Béo viết 19:01 ngày 01/10/2018

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

Văn Dương viết 19:00 ngày 01/10/2018

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.

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

Trần Hoàn viết 19:03 ngày 01/10/2018

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

Văn Dương viết 18:55 ngày 01/10/2018

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

Sáng Béo viết 18:55 ngày 01/10/2018

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(){
      ...
    }
});
Văn Dương viết 18:58 ngày 01/10/2018

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.

Sáng Béo viết 18:49 ngày 01/10/2018

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.

Hung viết 18:55 ngày 01/10/2018

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
Văn Dương viết 18:48 ngày 01/10/2018

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.

Bài liên quan
0