将IEnumerable List传递给javascript

Gab*_*abe 3 javascript asp.net-mvc

我想知道是否可以在页面加载时将IEnumerable Collection传递给Javascript方法.所以像这样......

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyAppMVC.Models.ViewModels.News.NewsIndexViewData>" %>

<div id="container">

    <%= String.Format("<script type='text/javascript'>testMethod({0})</script>", Model.NewsList)  %>

</div>
Run Code Online (Sandbox Code Playgroud)

我意识到JS是客户端,只是不知道是否有可能做到这一点?谢谢!

Mat*_*att 8

你不能.有几个原因.

1)在.NET中没有IEnumerable,因为你在.NET中使用它.有类似的东西,但实现方式完全不同.在.NET中,IEnumerable只是意味着该类提供了一个方法GetEnumerator(),它返回一个IEnumerator(它本身只包含Current,MoveNExt和Reset方法).在JavaScript中,当您对项目进行迭代时,您将迭代其属性的名称.

var myObj = { 'a' = 1, 'b' = 2 };

for (var name in myObj) { alert(name); } // will alert 'a', and 'b'
Run Code Online (Sandbox Code Playgroud)

即使在使用JavaScript数组时,上面的循环也会返回数组元素的索引,而不是该索引处的实际成员.

2)通过在列表上执行String.Format(),您不会将列表作为对象传递给JavaScript,而只是传递列表的ToString()结果.这可能只返回"System.Collections.Generic.List`1 [System.String]"

3)除非您的开发环境明确允许,否则您可以假设将参数从一种语言传递到另一种语言是行不通的.就像你不能在.NET代码中编写JavaScript一样,你不能在JavaScript中编写.NET代码.这些语言具有不同的功能集,不同的语法,并且使用完全不同的机制执行 - 编译.NET,并解释JavaScript(通常说话)(编译语言与解释语言).

您需要做的是将数据转换为JavaScript可以使用的格式.这很可能意味着将其转换为JSON.关于Model.NewList究竟是什么,或者testMethod()期望作为参数,你没有提供很多细节.但是为了一个例子,我们假设NewList是一个字符串列表.在这种情况下,您的JSON看起来像这样:

{ 'NewList' : ['string1', 'string2', 'string3'] }
Run Code Online (Sandbox Code Playgroud)

将.NET数据转换为JSON的最简单方法是使用内置库,例如JavaScriptSerializer:

System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
string json = serializer.Serialize(Mdoel.NewList);
Run Code Online (Sandbox Code Playgroud)