【问题标题】:Pass Array from MVC to javascript?将数组从 MVC 传递到 javascript?
【发布时间】:2017-04-08 22:18:41
【问题描述】:

我可以使用这个从 MVC ASP.NET 传递一个变量:

var lastCategoryId = '<%=Model.CS.LastSelectedCategory %>';

这适用于字符串或整数,但如何处理字符串数组?我尝试以相同的方式传递数组,但变量设置为 System.String[] ?

【问题讨论】:

    标签: javascript asp.net-mvc


    【解决方案1】:

    您可以通过这行简单的代码让 .NET 为您处理所有繁重的工作。

    这假设您使用的是 MVC Razor 语法。

    var yourJavaScriptArray = @Html.Raw(Json.Encode(Model.YourDotNetArray));

    对于较新版本的 MVC,请使用:

    var yourJavaScriptArray = @Html.Raw(Json.Serialize(Model.YourDotNetArray));

    【讨论】:

    • 这太神奇了!不知道这在 Razor 中得到支持,太棒了!
    • 请注意,Json.Encode() 不再适用于较新版本的 MVC。请改用Json.Serialize(Model.YourDotNetArray)
    【解决方案2】:

    你可以 JSON 序列化它。这种方式可以传递更复杂的值,而不必担心转义单引号、双引号等:

    var categoriesList = <%= new JavaScriptSerializer().Serialize(new[] { "value1", "value2" }) %>;
    

    编写一个 HTML 助手来做这件事会更好:

    public static class HtmlExtensions
    {
        public static string JsonSerialize(this HtmlHelper htmlHelper, object value)
        {
            return new JavaScriptSerializer().Serialize(value);
        }
    }
    

    然后在你看来:

    <script type="text/javascript">
        var categoriesList = <%= Html.JsonSerialize(new[] { "value1", "value2" }) %>;
    </script>
    

    【讨论】:

    • 我不得不承认这是一种比我的答案更干净的方法。这应该被投票作为解决方案,而不是我的帖子。
    • @Adrian,一切都是主观的。我个人讨厌在视图中看到 C#。而且我对视图中的循环特别过敏 :-) 另外,不对您输出的字符串进行编码是非常危险的,并且容易受到 XSS 攻击。这就是为什么我更喜欢总是依赖框架中内置的东西,这样我就不必担心正确转义,...
    • 每次看到 Darin Dimitrov 回答问题时,我都知道我会有解决方案。谢谢!
    【解决方案3】:

    应该这样做

    var someArray=[<%foreach (var s in myStringArray){%>'<%=s%>',<%}%>];
    

    【讨论】:

    • 你必须去掉最后一个逗号
    • @Omu:不一定。 Javascript 解析器在该领域非常宽容。所有常见的浏览器都不介意数组中的尾随逗号。
    • @AdrianGrigore,感谢您的回答..我有同样的问题。但是我从你的回答中找到了一种在 Js 中传递 mvc attary 的方法。但我的问题是这种类型的数组需要哪种类型的数组或类,请参阅我的问题:stackoverflow.com/questions/31911067/…
    【解决方案4】:

    类似这样的:

    <script type="text/javascript">
    var myArr = [<%=string.Join(",", strArr.Select(o => "\"" + o + "\"")) %>];
    </script>
    

    【讨论】:

    • 这个问题是它没有将字符串值用引号括起来,这会导致 JavaScript 错误。
    • @Matthew Manelathanx 告诉我,修复了它
    • 如果o 包含引号怎么办?如果它包含双引号怎么办?如果它包含可能窃取您的身份验证 cookie 的 javascript 和 XSS 代码怎么办?甚至无法想象编写这样的代码可能造成的灾难。
    • @Darin Dimitrov 好吧,你的权利,那只是一个简单的方法,可能他不需要编码,谁知道
    【解决方案5】:

    一个班轮:

    var data = [@Html.Raw(String.Join(",", Model.MyArray.Select(i => "'" + i + "'")))];
    

    【讨论】:

      【解决方案6】:

      使用 Json.NET

      var yourlist = JSON.parse('@Html.Raw(JsonConvert.SerializeObject(Model.YourList))');
      

      【讨论】:

        【解决方案7】:

        您需要将数组格式化为 JavaScript 数组语法。

        var someArray = [<%= Model.SomeArray.Select(x => "'" + x +"'")
                                   .Aggregate((x,y) => x + ", " + y);  %>];
        

        这将用单引号将每个条目括起来,然后用方括号之间的逗号将它们连接在一起。

        更新:删除了多余的括号。

        【讨论】:

        • 对不起,但我得到了这个解决方案的以下异常 = ) 预期
        • 我多了一个括号。我删除了它。立即尝试。
        【解决方案8】:

        如此简单,如此简单

        <script type="text/javascript">
            var array = @Html.Raw(
                Json.Encode(
                    (Model).Select(m=> new 
                    { 
                        id= m.ID, 
                        name=m.Name
                    })
                )
            );
        </script>
        

        输出是:

        [{"id":1,"name":"Name of 1"}, {"id":2,"name":"Name of 2"}, ...];
        

        【讨论】:

          【解决方案9】:

          只是想使用 Razor 语法提供答案:

          我们有一个Dictionary&lt;int, int&gt;,我们正在为 jQuery Sparkline 渲染,以“数组数组”的形式。

          var usageData = [ @string.Join(",", Model.UsageData.Select(d => string.Format("[{0},{1}]", d.Key, d.Value)).ToArray()) ];
          

          这样使用:

          $('#sparkline').UsageSparkline(usageData, { tooltipFormatter: cachedTooltips });
          

          这是我们查看源代码时得到的:

          var usageData = [ [-13,0],[-12,1],[-11,0],[-10,0],[-9,1],[-8,1],[-7,0],[-6,2],[-5,2],[-4,0],[-3,0],[-2,9],[-1,3],[0,4] ];
          $('#sparkline').UsageSparkline(usageData, { tooltipFormatter: cachedTooltips });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-08-01
            • 2017-05-07
            • 2016-11-05
            • 1970-01-01
            • 1970-01-01
            • 2015-04-10
            • 1970-01-01
            相关资源
            最近更新 更多