2010-08-12 3 views
32

Кто-нибудь знает, как передать массив ASP.NET ASP.NET в массив JavaScript? Образец кода также будет приятным.Pass C# ASP.NET массив в массив Javascript

Извините, если я был расплывчатым раньше, ребята. Вопрос на самом деле довольно прост. Допустим для простоты, что в моем aspx.cs файле я заявляю:

int [] numbers = new int[5]; 

Теперь я хочу передать numbers на стороне клиента, и использовать эти данные в массив в JavaScript. Как мне это сделать?

+0

Вы говорите о сериализации в JSON? –

+0

Я думаю, нам нужно больше деталей здесь. Вы хотите пройти, если от кода к aspx или хотите использовать AJAX для отправки массива данных в javascript ... или что-то совсем другое? – samandmoore

+0

смотрите выше. жаль, что слишком расплывчато. – locoboy

ответ

13

Вы можете использовать ClientScript.RegisterStartUpScript для вставки javascript на страницу на странице_Load.

Вот ссылка на MSDN ссылка: http://msdn.microsoft.com/en-us/library/asz8zsxy.aspx

Вот код в Page_Load:

List<string> tempString = new List<string>(); 
    tempString.Add("Hello"); 
    tempString.Add("World"); 

    StringBuilder sb = new StringBuilder(); 
    sb.Append("<script>"); 
    sb.Append("var testArray = new Array;"); 
    foreach(string str in tempString) 
    { 
    sb.Append("testArray.push('" + str + "');"); 
    } 
    sb.Append("</script>"); 

    ClientScript.RegisterStartupScript(this.GetType(), "TestArrayScript", sb.ToString()); 

Примечания: Используйте StringBuilder для создания строки сценария, как это, вероятно, будет долго.

А вот на Javascript, который проверяет нагнетаемой массив «testArray», прежде чем вы можете работать с ним:

if (testArray) 
{ 
    // do something with testArray 
} 

Там в 2 проблемы здесь:

  1. Некоторые считают это навязчивым для C# в add Javascript

  2. Мы должны будем объявить массив в глобальном контексте

Если вы не можете жить с этим, другой способ заключается в том, чтобы код C# сохранил массив в состоянии просмотра, а затем используйте JavaScript PageMethods (или веб-службы), чтобы перезвонить на сервер, чтобы получить это Просмотреть объект State как массив. Но я думаю, что это может быть излишним для чего-то подобного.

+0

Я буду благодарен за объяснение. Одна вещь, какой массив вы называете глобальным и почему? – locoboy

+0

также можете указать, что это такое. GetType() имеет в виду? – locoboy

+2

@Gary: Меня беспокоит сериализация ad hoc. Если строки в этом списке должны содержать одинарные кавычки, у нас возникнет проблема. Вот почему использование сериализатора JSON безопаснее. –

51

сериализовать с System.Web.Script.Serialization.JavaScriptSerializer класса и присвоить Javascript вар

манекен образца:

<% var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); %> 
var jsVariable = <%= serializer.Serialize(array) %>; 
+0

извините за двусмысленность. см. выше. – locoboy

+0

@zerkms Вы могли бы объяснить, что происходит? жаль, что я noob на этом – locoboy

+0

@zerkms - рассмотрите возможность редактирования этого ответа, чтобы завершить его, и подчеркнуть тот факт, что он поддерживает произвольные типы? –

10

В файле страницы:

<script type="text/javascript"> 
    var a = eval('[<% =string.Join(", ", numbers) %>]'); 
</script> 

в коде позади:

public int[] numbers = WhatEverGetTheArray(); 
+0

Я не уверен, что понимаю ответ здесь ... Можете ли вы пройти через меня? – locoboy

+0

@ cfarm54-В коде позади вы инициализируете int [] называемые номерами. А затем в javascript 'string.Join (", ", numbers)' сделайте массив "numbers" равным строке "1,2,3,4". После этого мы используем 'eval ('[1,2,3,4]')' для преобразования массивной строки в массив. –

+0

ahhh tricky. однако какой тип массива js? – locoboy

17

Это должно дополнить ответ zerkms.

Для передачи данных через языковые барьеры вам понадобится способ представления данных в виде строки путем сериализации данных. Одним из методов сериализации JavaScript является JSON. В примере zerkms код будет помещен внутри страницы aspx.Для того, чтобы объединить его примеру и ваш вместе на одной странице ASPX, вы бы,

<% 
    int[] numbers = new int[5]; 
    // Fill up numbers... 

    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
%> 

где-то позже на ASPX странице

<script type="text/javascript"> 
    var jsVariable = <%= serializer.Serialize(numbers) %>; 
</script> 

Этот ответ, хотя, предполагается, что вы создаете JavaScript из исходной страницы нагрузки. В соответствии с комментариями в вашем сообщении это могло быть сделано через AJAX. В этом случае вы ответили бы сервером на результат сериализации, а затем десериализовали его на JavaScript, используя вашу любимую фреймворк.

Примечание: Также не отмечайте это как ответ, так как я хотел, чтобы подсветка синтаксиса сделала другой ответ более понятным.

+0

Вы имеете в виду: var jsVariable = <% = serializer.Serialize (numbers)%> ? – locoboy

+0

также, что вы имеете в виду generatign js от начальной загрузки страницы? – locoboy

+0

Нет, потому что вы находитесь в контексте генерации JavaScript. Когда у вас есть int [] numbers = new int [5] {1, 3, 5, 7, 9}, сериализация его дает вам «[1, 3, 5, 7, 9]». Таким образом, сгенерированный javascript становится «var jsVariable = [1, 3, 5, 7, 9]»; –

6

Для массива объектов:

var array= JSON.parse('@Newtonsoft.Json.JsonConvert.SerializeObject(numbers)'.replace(/&quot;/g, "\"")); 

Для массива междунар:

var array= JSON.parse('@Newtonsoft.Json.JsonConvert.SerializeObject(numbers)'); 
3

Prepare массив (в моем случае это 2d массив):

 // prepare a 2d array in c# 
     ArrayList header = new ArrayList { "Task Name", "Hours"}; 
     ArrayList data1 = new ArrayList {"Work", 2}; 
     ArrayList data2 = new ArrayList { "Eat", 2 }; 
     ArrayList data3 = new ArrayList { "Sleep", 2 }; 
     ArrayList data = new ArrayList {header, data1, data2, data3}; 
     // convert it in json 
     string dataStr = JsonConvert.SerializeObject(data, Formatting.None); 
     // store it in viewdata/ viewbag 
     ViewBag.Data = new HtmlString(dataStr); 

PARSE его в представлении.

<script>  
    var data = JSON.parse('@ViewBag.Data'); 
    console.log(data); 
</script> 

В вашем случае вы можете напрямую использовать имя переменной вместо ViewBag.Data.

1

Я столкнулся с подобной ситуацией, и я спокойно ее разрешил. Вот что я сделал. Предположим, что у вас уже есть значение в массиве на вашей странице aspx.cs.

1) Поместите скрытое поле на страницу aspx и нам скрытый идентификатор поля, чтобы сохранить значение массива.

HiddenField2.Value = string.Join(",", myarray); 

2) Теперь, когда скрытое поле хранит значение, просто разделяется запятыми. Используйте это скрытое поле в JavaScript, как это. Просто создайте массив в JavaScript, а затем сохраните значение в этом массиве, удалив запятые.

var hiddenfield2 = new Array(); 
hiddenfield2=document.getElementById('<%=HiddenField2.ClientID%>').value.split(','); 

Это должно решить вашу проблему.

+0

Спасибо, со всеми новыми MVC и другими технологиями я забыл об этом классике: P –

Смежные вопросы