我想知道是否可以在页面加载时将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>
我意识到JS是客户端,只是不知道是否有可能做到这一点? 谢谢!
答案 0 :(得分: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'
即使使用JavaScript数组,上面的循环也会返回数组元素的索引,而不是该索引处的实际成员。
2)通过在列表上执行String.Format(),您不会将列表作为对象传递给JavaScript,而只是传递列表的ToString()结果。这可能只返回“System.Collections.Generic.List`1 [System.String]”
3)除非您的开发环境明确允许,否则您可以假设将参数从一种语言传递到另一种语言是行不通的。就像你不能在.NET代码中编写JavaScript一样,你不能在JavaScript中编写.NET代码。这些语言具有不同的功能集,不同的语法,并且使用完全不同的机制执行 - 编译.NET,并解释JavaScript(通常说话)(Compiled vs. Interpreted languages)。
您需要做的是将数据转换为JavaScript可以使用的格式。这很可能意味着将其转换为JSON。关于Model.NewList究竟是什么,或者testMethod()期望作为参数,你没有提供很多细节。但是为了一个例子,我们假设NewList是一个字符串列表。在这种情况下,您的JSON看起来像这样:
{ 'NewList' : ['string1', 'string2', 'string3'] }
将.NET数据转换为JSON的最简单方法是使用内置库,例如JavaScriptSerializer:
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
string json = serializer.Serialize(Mdoel.NewList);
答案 1 :(得分:0)
您可以使用以下代码在Page_Load中的代码中注册javascript(注意我假设Model.NewsList
是string enumeration
或array
):
StringBuilder sb = new StringBuilder();
bool isFirst = true;
//build a comma seperated list.
foreach (string s in Model.NewsList)
{
if (isFirst)
isFirst = false;
else
sb.Append(", ");
sb.Append("'").Append(s.Replace("'", "''")).Append("'");
}
//create the javascript array
string javascript = String.Format(@"var news = [{0}];", sb);
//put the array in the generated page.
Page.ClientScript.RegisterClientScriptBlock(GetType(), "newsList", javascript);
这会将javascript放在页面上,可以通过其他javascript函数访问。