JSONデータを使用してMVCコントローラーを呼び出すjavascript関数があります。
var specsAsJson = JSON.stringify(specs);
$.post('/Home/Save', { jsonData: specsAsJson });
サーバー側では、コントローラー内で、このエラーを乗り越えることができないようです。
/ Date(1347992529530)/はDateTimeの有効な値ではありません。
この例外は、Deserialize()(以下のメソッドの3行目)を呼び出すと発生します。
public ActionResult Save(string jsonData)
{
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new TimeSpanJsonConverter() });
var specs = serializer.Deserialize<List<EquipmentSpecWithParameterlessConstructor>>(jsonData);
return View("Index", _allTrackerJobs);
}
私はいくつかのグーグルを行ってきました、そして上記のコードはこれを機能させるための私の最新の試みです(ここからTimeSpanJsonConverterを使用して)。他のアプローチでは、サーバーに日付のみを送信することが示されていますが、いくつかのプロパティとして日付を持つオブジェクトのリストがあります。
これを解決するためのエレガントで一般的に受け入れられているアプローチはありますか、それとも何らかの醜い回避策が必要ですか?これを解決する正しい方法は何ですか?
===================元の質問の終わり===================
編集-JsonConvertを使用してシリアル化することで解決
以下の私の答えを参照してください(この質問のくだらない回避策ではありません)。
編集-安っぽい回避策
ドメインオブジェクトとまったく同じフィールドを使用してDTOを作成しましたが、日付フィールドを逆シリアル化するように文字列を作成しました。デシリアライズできるようになったので、日付を有効な形式に変換して、DTOからドメインオブジェクトを作成できるようにします。
public class EquipmentSpecDto
{
public string StartTime { get; set; }
public string EndTime { get; set; }
// more properties here
}
そして、私は単にDTOを逆シリアル化に使用しました。
var specs = serializer.Deserialize<List<EquipmentSpecDto>>(jsonData);
編集2-JavaScriptの日付を.NETに変換する
完全を期すために、そして私が他の誰かを1時間節約することを期待して、これが私がjavascriptの日付を変換することができた方法です:
foreach (EquipmentSpecDto specDto in specDtos)
{
// JavaScript uses the unix epoch of 1/1/1970. Note, it's important to call ToLocalTime()
// after doing the time conversion, otherwise we'd have to deal with daylight savings hooey.
DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
Double startMilliseconds = Convert.ToDouble(specDto.StartTime.Substring(6, 13));
Double endMilliseconds = Convert.ToDouble(specDto.EndTime.Substring(6, 13));
DateTime startTime = unixEpoch.AddMilliseconds(startMilliseconds).ToLocalTime();
DateTime endTime = unixEpoch.AddMilliseconds(endMilliseconds).ToLocalTime();
EquipmentSpec spec = new EquipmentSpec(startTime, endTime, specDto.Equipment);
specs.Add(spec);
}