10

System.Web.Helpers.Json.Encode()如果模型包含DateTime属性,我会遇到由 ASP.NET MVC 生成的 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 类型。

4

6 回答 6

8

日期类型在 JavaScript 中没有文字。您将不得不调用它的构造函数。

var myDate = new Date(@Html.Raw(Json.Encode(Model.MyDateTime)));
于 2013-06-26T22:11:50.067 回答
2

此行为是设计使然。

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

于 2013-06-26T22:10:05.423 回答
2

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

  var dob = @Html.Raw(Json.Encode(Model.BirthDate.HasValue ? Model.BirthDate.Value.ToShortDateString() : null));
于 2014-09-11T17:42:37.483 回答
2

使用 Newtonsoft 对对象进行编码会产生 ISO 格式的日期。

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

日期格式:

0001-01-01T00:00:00
于 2020-02-24T17:05:04.130 回答
1

您可以使用

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() 对象时,它是根据浏览器的 GMT 时间创建的。

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

于 2013-09-23T13:52:35.330 回答
0

使用 Forloop.HtmlHelpers nuget 包,您可以获得 AddScriptBlock HtmlHelper 扩展,并使用 Newtonsoft 调用执行类似的操作以在脚本中设置变量:

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

}

于 2014-02-08T11:10:12.407 回答