Passing dates between c# and javascript

Viewed 2022

I have an ASP.Net MVC app that returns a view model, which when converted to JSON using system.web.mvc.jsonresult looks as follows:

enter image description here

On the client I'm using KnockoutJS. I use MomentJS to format the value for the VoucherDate so that it can be displayed for humans:

 var recsArray = [];
                $.each(data.Vouchers, function (key, value) {
                    recsArray.push(
                        new edited(
                            interchangeId,
                            value.SupplierIsValid,
                            value.VoucherNo,
                            value.LegacySupplierId,
                            value.Transactions,
                            moment(value.OriginalVoucher.VoucherDate).format('YYYY/MM/DD HH:mm'),
                            value.OriginalVoucher
                            )
                    );

As you can see from the previous code snippet, in addition to pushing the data into an observable array for display in a KOGrid, I also push the entire "OriginalVoucher". This enables the user to edit the value for "LegacySupplierId" and click "Resubmit" which posts back the entire view model as seen below:

self.resubmit = function () {
        var data = {
            Vouchers: ko.toJS(this.recs),
            BatchId: self.batchId(),
            InterchangeId: interchangeId,
            IsReadWrite: self.isReadWrite,
            Interface: self.interface,
            ReportClient: self.reportClient
        };

        $.ajax({
            type: "POST",
            url: BASE_URL + 'EditBatch/ResubmitRejectedVouchersAsNewBatch',
            data:  ko.toJSON(data),

I've checked using Fiddler and confirmed that the VoucherDate fields contain values such as /Date(14543712000000)/. My problem is, when reading in the C# controller, all of the dates are presented as 1/1/0001 12:00:00 AM.

enter image description here

I've read that javascript has a date.toISOString() function to convert to a format that C# will be happy with. Is there a better way that trying to find each date field in the javascript view model and executing a conversion against each before posting back to the C# controller

I think I have previously solved this problem using automapper by following instructions here: enter link description here

In my source code I can see that I created the following class but I don't know how / if this gets used:

public class JsonDateTimeTypeConvertor : ITypeConverter<string, DateTime>
{
    public DateTime Convert(ResolutionContext context)
    {
        string jsonDate = context.SourceValue.ToString();

        string offsetAsString = Regex.Match(jsonDate, @"\d+").Value;
        double offset = System.Convert.ToDouble(offsetAsString);

        DateTime ret = DataUtils.ConvertFromUnixTimestamp(offset);

        return ret;
    }

}

I think it was being used but I've inadvertently disabled it. This probably happened when I changed the type for the ViewModel received by the controller. The previous version of the application worked, so I guess the datetime was being converted correctly - probably by this automapper extension. I have pulled the old version of the code from TFS but can't figure out how it's doing the magic - I wish I'd made better notes at the time! All I have is:

I needed to create a custom type convertor to deal with JSON dates being passed to the EditBatch controller in the format of number of milliseconds since 1900.

I followed the wiki documentation from here:

https://github.com/AutoMapper/AutoMapper/wiki/Custom-type-converters

3 Answers
Related