Сериализация Javascript DateTime в asp.net не дает объект даты javascript?
Когда я анализирую DateTime для json в .Net, он возвращает строку (т.е. "\/Date(1249335194272)\/"
). Как заставить его возвращать конструктор объекта js Date не вставлять в строку?
// js server code
var dteNow = <%= jsonDateNow %>;
// js rendered code
var dteNow = "\/Date(1249335477787)\/";
// C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.Script.Serialization;
using System.Web.UI.WebControls;
namespace testing{
public partial class iTaxPrep : System.Web.UI.Page
{
protected string jsonDateNow;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
jsonDateNow = new JavaScriptSerializer().Serialize(DateTime.Now);
}
}
}
}
Ответы
Ответ 1
Это похоже на работу (спасибо Крису S за эту идею). В С# выполните замену, чтобы удалить оболочку строки вокруг объекта даты;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.Script.Serialization;
using System.Web.Script.Services;
using System.Web.Services;
using System.Web.UI.WebControls;
namespace test
{
[ScriptService]
public partial class testing: System.Web.UI.Page
{
protected string strCaseID;
protected string jsonCase;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
strCaseID =Tools.GetQueryObject("id");
// get a complex object with dates, string, arrays etc.
jsonESHACase = new JavaScriptSerializer().Serialize(objCase.Get(strCaseID ))
.Replace("\"\\/Date(", "new Date(").Replace(")\\/\"", ")");
}
}
}
}
.. и после удаления кавычек и добавления нового префикса в Date это js теперь работает. Ура!
testCase= <%= jsonESHACase %>;
if (testCase) {
document.write(testCase["ClosingDate"].format("MM dd yyyy"));
}
Ответ 2
Это известное ограничение с JSON. Этот ответ может помочь вам, в частности:
value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));
Ответ 3
Простое манипулирование JavaScript следующим образом:
function(param){
var date = new Date(parseInt(param.substr(6)));
return date;
}
Передайте дату JSON как параметр функции, и она вернет дату javascript.
Ответ 4
С небольшими манипуляциями с строкой и eval вы можете создать объект Date
var dteNow = "\/Date(1249335477787)\/";
var dteObj = eval("new " + dteNow.replace(/\//g,""));
Ответ 5
Вы можете попробовать следующее:
"MyField: " + string.Format("(function(y,m,d,h,mm,s){{var d=new Date(Date.UTC(y,m-1,d,h,mm,s));return d;}})({0},{1},{2},{3},{4},{5})", d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second);
Это похоже на работу в FF и IE.
Ответ 6
jsonDateNow = String.Format("Date({0},{1},{2})", Date().Now.getYear(), Date().Now.getMonth() -1, Date().Now.getDay());
Ответ 7
Я обнаружил, что это полезный метод решения этой проблемы:
http://icanmakethiswork.blogspot.co.uk/2012/04/beg-steal-or-borrow-decent-javascript.html
Он позволяет сериализовать DateTimes как строки даты ISO 8601, которые могут использоваться с конструктором даты JavaScript, и имеет бонус к тому, чтобы быть читаемым человеком.
Ответ 8
Здесь используется опция Date.parse и DateTime.ToString:
var lowerBound = new Date(Date.parse("@Model.LowerBound.ToString("MMMM dd, yyyy")"));
Если вам нужно время, рассмотрите следующее. Я полагаю, что это зависит от новой спецификации javascript:
var lowerBound = new Date(Date.parse("@Model.LowerBound.ToUniversalTime().ToString("s")"));
Здесь вариант с использованием jQuery: (я уверен, что есть способ добавить здесь время)
var lowerBound = $.datepicker.parseDate('yy-mm-dd', "@Model.LowerBound.ToString("yyyy-MM-dd")");
Ответ 9
Если вы используете Json.NET
или Newtonsoft.Json
, просмотрите эту ссылку:
Сериализация дат в JSON
Ответ 10
Немного проще очистить строку с помощью RegEx...
var myDate = "\/Date (1508821200000)/";
var jsDate = new Date (parseInt (myDate.replace(/\ D/g, '')));
Ответ 11
В этом примере работает
JavaScriptSerializer serializer = new JavaScriptSerializer();
DateTime dt = DateTime.Now;
DateTime dt1 = dt;
string jsonDateNow = serializer.Serialize(dt1);