Pase IEnumerable List a javascript

Me preguntaba si podría pasar una Colección IEnumerable a un método Javascript en la carga de la página. Entonces algo como esto …

<%@ 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> 

Me doy count de que JS está del lado del cliente, ¿simplemente no sabía si había alguna manera posible de hacerlo? ¡Gracias!

No, no puedes. Por varias razones.

1) No hay IEnumerable en JavaScript, ya que lo usa en .NET. Hay algo similar, pero se implementa de manera completamente diferente. En .NET, IEnumerable solo significa que la class proporciona un método, GetEnumerator (), que devuelve un IEnumerator (que a su vez solo contiene los methods Current, Move NExt y Reset). En JavaScript, cuando haces una iteración para un artículo, estás iterando sobre los nombres de sus properties.

 var myObj = { 'a' = 1, 'b' = 2 }; for (var name in myObj) { alert(name); } // will alert 'a', and 'b' 

Incluso cuando se trabaja con arreglos de JavaScript, el ciclo anterior devuelve el índice del elemento de la matriz, no el miembro real en ese índice.

2) Al hacer un String.Format () en su list, no habría estado pasando la list como un object a su JavaScript, sino solo el resultado ToString () de su list. Que probablemente solo devuelve "System.Collections.Generic.List`1 [System.String]"

3) A less que su entorno en desarrollo lo permita explícitamente, puede suponer que pasar arguments de un idioma a otro no va a funcionar. Al igual que no puede escribir JavaScript dentro de su código .NET, no puede escribir código .NET en su JavaScript. Estos lenguajes tienen diferentes sets de características, diferente syntax, y se ejecutan con mecanismos completamente diferentes: se comstack .NET y se interpreta JavaScript (generalmente hablando) ( idiomas comstackdos frente a idiomas interpretados ).

Lo que tienes que hacer es transformar tus datos en un formatting que pueda ser utilizado por JavaScript. Lo más probable es que esto signifique convertirlo en algo llamado JSON . No proporcionó muchos detalles sobre qué es exactamente Model.NewList, o qué espera su método TestMethod () como argumento. Pero por el bien de un ejemplo, supongamos que NewList es una list de cadenas. En ese caso, su JSON se vería así:

 { 'NewList' : ['string1', 'string2', 'string3'] } 

La forma más sencilla de convertir sus datos .NET en JSON es utilizar bibliotecas integradas, como JavaScriptSerializer:

 System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); string json = serializer.Serialize(Mdoel.NewList); 

Puede registrar el javascript en el código que está detrás en el Page_Load con el siguiente código (Nota, supongo que Model.NewsList es una string enumeration o array string enumeration ):

 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); 

Esto pondrá al javascript en la página accesible desde otras funciones de JavaScript.