ASP.NET MVC Json.Encode()DateTime编码问题字符串不是日期类型

本文关键字:字符串 问题 类型 日期 编码 DateTime MVC NET Json Encode ASP | 更新日期: 2023-09-27 18:20:06

如果模型包含DateTime属性,则ASP.NET MVC的System.Web.Helpers.Json.Encode()生成的JavaScript出现问题。

我的型号:

public class MyViewModel
{
    public string MyString { get; set; }
    public DateTime MyDateTime { get; set; }
    public int MyInt { get; set; }
    public string[] MyStringArray { get; set; }
}

我的控制器:

public ActionResult Index()
{
    var myViewModel = new MyViewModel();
    myViewModel.MyString = "My test string";
    myViewModel.MyInt = 100;
    myViewModel.MyDateTime = DateTime.Now;
    myViewModel.MyStringArray = new string[] { "string 1", "string 2" };
    return View(myViewModel);
}

我的观点:

<script type="text/javascript">
    var myViewModel = @Html.Raw(Json.Encode(Model)) ;
</script>

输出:

<script type="text/javascript">
    var myViewModel = {"MyString":"My test string","MyDateTime":"'/Date(1372280916431)'/","MyInt":100,"MyStringArray":["string 1","string 2"]} ;
</script>

问题在于日期的编码方式。它是一个字符串,而不是日期类型。

我也尝试过使用Newtonsoft.Json.JsonConvert.SerializeObject(),但我仍然得到一个字符串,而不是Date类型。

ASP.NET MVC Json.Encode()DateTime编码问题字符串不是日期类型

日期类型在JavaScript中没有文本。您将不得不调用它的构造函数。
var myDate = new Date(@Html.Raw(Json.Encode(Model.MyDateTime)));

这种行为是经过设计的。

JSON(与Javascript不同)不具有日期类型。

从这些答案中获得灵感,我需要将可为null的日期传递给MVC控制器,并将其正确绑定到模型中。这是我降落的地方:

  var dob = @Html.Raw(Json.Encode(Model.BirthDate.HasValue ? Model.BirthDate.Value.ToShortDateString() : null));

使用Newtonsoft将对象编码为ISO格式的日期。

@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model))

日期格式:

0001-01-01T00:00:00

您可以使用

var myDate = new Date(parseInt('@Html.Raw(Json.Encode(Model.MyDateTime))'.substr(6)));

var myDate = new Date(parseInt('@Html.Raw(Json.Encode(Model.MyDateTime))'.replace('/Date(', '')));

两者都会忽略"/Date("部分,而使用"parseInt"则会忽略最后一个")/"部分。然后从毫秒中获取日期对象。

但不要忘记,当您创建Date()对象时,它是根据Browser的GMT时间创建的。

在javascript代码中使用此Date()对象时,我总是使用UTC日期方法,如:myDate.getUTCHours();

使用Forloop.HtmlHelpers nuget包,您可以获得AddScriptBlock HtmlHelper扩展,并使用Newtonsoft调用来设置脚本中的变量:

@{
using (var context = Html.BeginScriptContext())
{
    Html.AddScriptBlock(@"
$(function () {
        var data = " + JsonConvert.SerializeObject( Model.Data ) + @";
        ///continue processing ...
});");
}

}