Передать IEnumerable List в javascript - PullRequest
       6

Передать IEnumerable List в javascript

3 голосов
/ 05 октября 2009

Мне было интересно, смогу ли я передать коллекцию IEnumerable в метод 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 на стороне клиента, просто не знал, есть ли способ сделать это? Спасибо!

Ответы [ 2 ]

8 голосов
/ 05 октября 2009

Нет, вы не можете. По нескольким причинам.

1) IEnumerable отсутствует в JavaScript, поскольку вы используете его в .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) Если ваша среда разработки явно не разрешает это, вы можете предположить, что передача аргументов из одного языка в другой не будет работать. Так же, как вы не можете писать JavaScript внутри своего кода .NET, вы не можете писать код .NET в своем JavaScript. Эти языки имеют разные наборы функций, разный синтаксис и выполняются с совершенно разными механизмами - .NET компилируется, и JavaScript (как правило, говорящий) интерпретируется ( Скомпилированные против интерпретируемых языков ).

Что вам нужно сделать, это преобразовать ваши данные в формат, который может быть использован 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);
0 голосов
/ 05 октября 2009

Вы можете зарегистрировать JavaScript в коде, указанном в Page_Load, с помощью следующего кода (заметьте, я предполагаю, что 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...