【问题标题】:ASP.NET MVC 3 Razor : Initialize a JavaScript arrayASP.NET MVC 3 Razor:初始化一个 JavaScript 数组
【发布时间】:2011-10-10 06:44:31
【问题描述】:

在 ASP.NET MVC 3 中使用 Razor 初始化 JS 数组的首选方法是什么?

例如初始化一个表示日期的字符串数组:

<script type="text/javascript">
    var activeDates = ["7-21-2011", "7-22-2011"];
</script>

public class MyViewModel
{    
  public DateTime[] ActiveDates { get; set; }
}

【问题讨论】:

    标签: javascript arrays asp.net-mvc-3 razor


    【解决方案1】:

    我昨天碰巧做了这个并想出了这个解决方案(如果你希望它看起来像你在问题中的输出 - 我正在使用这个 jqplot):

    <script type="text/javascript">
        var activeDates = ['@Html.Raw(string.Join("', '", @ActiveDates.Select(f => string.Format("{0:MM-dd-yyyy}", f)).ToArray()))']
    </script>
    

    【讨论】:

    • "@string" 不应该是 "@Html.Raw(String" with 按照 ) 最后和 "@ActiveDates", Model.ActiveDates 吗?还是 C# Razor 和 VB razor 的区别?
    • 在这种情况下你是对的,因为 Razor 将编码 ''s 我刚刚写了它,但谢谢你。 :)
    • @Matthieu:string 上的小写 s 对 C# 有效。您的问题中没有任何内容指示 VB,因此这个答案足够有效。我不确定 VB 将如何在这里处理小写字母 s。 VB 使用大写的 S,但在过去,它从未对类型的大小写挑剔。我不知道它在 VB Razor 中的情况,因为我最近才开始使用 MVC/Razor,并且只使用 C# Razor 进行编码。附带说明一下,您总是可以在 String 上使用大写字母,因为这是 .NET 版本的声明方式(无论语言如何)。
    【解决方案2】:

    我不太了解 JS 和 ASP.NET MVC 3 Razor 之间的关系。无论服务器上使用哪种技术生成页面,Javascript 都会在客户端运行。所以在javascript上一个数组就是一个数组。

    在 javascript 中定义对象数组有多种可能性

    var activeDates = [ '7-21-2011', '7-22-2011' ];
    

    或:

    var activeDates = new Array();
    activeArrays.push('7-21-2011');
    activeArrays.push('7-22-2011');
    

    还是:

    var activeDates = new Array();
    activeArrays[0] = '7-21-2011';
    activeArrays[1] = '7-22-2011';
    

    最后,所有这些都代表同一个数组。但它是一个字符串数组,而不是日期

    如果你想要一个日期数组,你可以这样做:

    var activeDates = [ 
        new Date(2011, 6, 21, 0, 0, 0, 0), 
        new Date(2011, 6, 22, 0, 0, 0, 0) 
    ];
    

    现在我可以看到与您对 ASP.NET MVC 的问题的唯一关系是您的视图模型上可能有一些数组:

    public class MyViewModel
    {
        public DateTime[] ActiveDates { get; set; }
    }
    

    您想在 javascript 数组中进行序列化和操作。在这种情况下,语法如下:

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

    现在,由于 DateTime 字段在 .NET 中的 JSON 序列化方式,您最终将在生成的 HTML 中得到以下内容:

    var activeDates = ["\/Date(1309471200000)\/","\/Date(1311199200000)\/"];
    

    如果您想将此字符串数组转换为实际 javascript 日期数组:

    var dates = $.map(activeDates, function(date, index) {
        date = date.replace('/Date(', '').replace(')/', '');  
        return new Date(parseInt(date));
    });
    

    【讨论】:

    • 调整了我的问题以便更好地描述问题,谢谢!
    • +1 - 您甚至可以缩短映射函数以使用new Date(parseInt(date.substr(6)));,因为parseInt 将忽略结尾)/
    • @DarinDimitrov 我们不会在这里混合 C# 和 JS。我们只是试图通过 razor C# 渲染一个语句,JS 编译器可以获取并初始化一个数组。
    • @Lakshay,我没有说相反。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2011-08-15
    相关资源
    最近更新 更多