Передача значений переменных из C# в JavaScript
Прежде всего, извините за вопрос, на который так много раз отвечали, но я перепробовал большинство из упомянутых процедур и до сих пор не могу заставить его работать.
У меня есть приложение ASP.NET (на стороне сервера), и я хотел бы визуализировать некоторые результаты с помощью WebGL (JavaScript, на стороне клиента). Я могу создать холст в aspx-файле и нарисовать 3D-объект (куб), написав ВСЕ необходимый код JS в jscript-файле (если я знаю, что хочу нарисовать заранее, и записать все это в Jscript). Однако я намерен написать другой объект в зависимости от моего серверного кода. Когда я нажимаю кнопку визуализации, запускается обратная передача. На сервере выполняется некоторый код, а некоторые координаты возвращаются в массив, определенный глобально в файле aspx.cs. Мне нужно было бы передать этот массив координат узла с сервера в файл JS, чтобы нарисовать объект, который я хочу.
Вот в основном то, что я пробовал:
- Я нашел самый простой способ передать переменную - объявить свойство public в aspx.cs (код C#), а затем в JS:
var clientVariable = '<%=ServerVariable%>';
Я пробовал это не с массивом, а только с строковой переменной и если пишу: alert(clientVariable);
Я вижу "<% = ServerVariable%>" в окне, а не фактическое значение. Я не знаю, нужна ли мне дополнительная библиотека или что-то в этом роде. Если я не смогу заставить этот простой пример работать, я не знаю, как бы я это сделал с двойным массивом. Я использую MCVS08, ASP.NET 3.5 с HTML5.
Кроме того, я попытался преобразовать массив не с помощью JSON, а с помощью:
Page.ClientScript.RegisterArrayDeclaration();
Я использовал
ClientScript.RegisterStartupScript(GetType(), "alert", "test2('" + A + "');", true);
Я пытался использовать скрытый блок для хранения значения сеанса и т. Д.
Итак, подводя итоги, я бы хотел получить:
на стороне сервера: после выполнения функции кода на сервере, при повторном рендеринге страницы у меня будет глобальная переменная в aspx.cs, представляющая собой двойные [,] координаты, содержащие координаты узлов, которые будут определять 3D объект.
aspx: в html (не asp.net) у меня есть тег canvas, в котором я хочу иметь визуализацию. Сценарий, который будет отображать изображение на стороне клиента, хранится в файле JScript. В этом файле внутри функции у меня есть переменная var vertices = []; который мне нужно кормить со значениями, которые я получил от сервера в массиве координат. Я не знаю, как добиться этого наилучшим способом. Вы бы порекомендовали использовать AJAX?
Любое предложение / комментарий будет очень признателен. Поскольку фиктивный пример с простой строкой не работает (забывая про canvas, webGL и все такое), могу ли я что-то еще сделать или я неправильно понимаю, как это сделать правильно?
2 ответа
Когда мне нужно передать переменные в JavaScript, я обычно предпочитаю var clientVariable = '<%=ServerVariable%>';
решение. Этот метод достаточен для небольшого числа скалярных переменных. Если вам нужно передать сложный объект или массив, рассмотрите возможность использования JavaScriptSerizlizer
,
Такое поведение может происходить по ряду причин. Один из них может произойти, если вы включили скриптлет в .js
файл, а не в .aspx
файл.
Вот как я бы это сделал:
WebGL-ничья-file.js:
window.WebGlDraw = function(points /* point array */)
{
// Draw points here
}
Page1.aspx.cs:
public string GetSerializedServerVariable()
{
new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ServerVariable);
}
Page1.aspx:
<html>
<header>
<script src="webgl-draw-file.js"/>
<script type=text/javascript>
window.WebGlDraw(<%=this.GetSerializedServerVariable()%>);
</script>
</header>
<body>
...
</body>
</html>
Чтобы лучше понять, какие значения передаются в функцию JS, взгляните на источник страницы с помощью браузера. Вы должны увидеть JSON-представление вашего массива вместо <%=Page.GetSerializedServerVariable()%>
скриптлет.
Это должно выглядеть примерно так:
<html>
<header>
<script src="webgl-draw-file.js"/>
<script type=text/javascript>
window.WebGlDraw([{x:1, y:2}, {x:1, y:2}, {x:1, y:2}, {x:1, y:2}]);
</script>
</header>
<body>
...
</body>
</html>
Можете ли вы сериализовать данные следующим образом:
<% var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); %>
var doublearr = <%= serializer.Serialize(ServerVariable) %>;