Ответ 1
Вы можете использовать метод Page.ClientScript.RegisterStartupScript.
Я хотел бы вызвать функцию javascript из элемента управления aspx. Например, предположим, что у меня было:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function test(x, y)
{
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Button"
onclick="Button1_Click"/>
</div>
</form>
</body>
</html>
и в коде позади:
protected void Button1_Click(object sender, EventArgs e)
{
// do stuff (really going to a database to fill x and y)
int[] x = new int[] { 1, 2, 3, 4, 5 };
int[] y = new int[] { 1, 2, 3, 4, 5 };
// call javascript function as test(x,y);
}
Есть ли способ сделать это?
Вы можете использовать метод Page.ClientScript.RegisterStartupScript.
Посмотрите на метод ScriptManager.RegisterStartupScript, если вы используете ScriptManager или любые Ajax-элементы управления/асинхронные обратные копии.
Edit:
На самом деле функция, которую вы хотите, вероятно, ScriptManager.RegisterClientScriptBlock
Некоторые другие вещи, которые я узнал:
Вы не можете напрямую передать массив, например:
this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "xx",
"<script>test("+x+","+y+");</script>");
потому что он вызывает методы ToString() для x и y, который возвращает "System.Int32 []", и, очевидно, Javascript не может этого использовать. Мне пришлось передавать массивы в виде строк, например "[1,2,3,4,5]", поэтому я написал вспомогательный метод для преобразования.
Кроме того, существует разница между this.Page.ClientScript.RegisterStartupScript() и this.Page.ClientScript.RegisterClientScriptBlock() - первый помещает script в нижнюю часть страницы, что мне нужно, чтобы иметь доступ к элементам управления (например, с document.getElementByID). RegisterClientScriptBlock() выполняется до того, как теги будут визуализированы, поэтому я действительно получаю Javascript-ошибку, если я использую этот метод.
http://www.wrox.com/WileyCDA/Section/Manipulating-ASP-NET-Pages-and-Server-Controls-with-JavaScript.id-310803.html подробно описывает разницу между двумя.
Вот полный пример, который я придумал:
// code behind
protected void Button1_Click(object sender, EventArgs e)
{
int[] x = new int[] { 1, 2, 3, 4, 5 };
int[] y = new int[] { 1, 2, 3, 4, 5 };
string xStr = getArrayString(x); // converts {1,2,3,4,5} to [1,2,3,4,5]
string yStr = getArrayString(y);
string script = String.Format("test({0},{1})", xStr, yStr);
this.Page.ClientScript.RegisterStartupScript(this.GetType(),
"testFunction", script, true);
//this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(),
//"testFunction", script, true); // different result
}
private string getArrayString(int[] array)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < array.Length; i++)
{
sb.Append(array[i] + ",");
}
string arrayStr = string.Format("[{0}]", sb.ToString().TrimEnd(','));
return arrayStr;
}
//aspx page
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function test(x, y)
{
var text1 = document.getElementById("text1")
for(var i = 0; i<x.length; i++)
{
text1.innerText += x[i]; // prints 12345
}
text1.innerText += "\ny: " + y; // prints y: 1,2,3,4,5
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="Button"
onclick="Button1_Click" />
</div>
<div id ="text1">
</div>
</form>
</body>
</html>
включить script manager
код за функцией
ScriptManager.RegisterStartupScript(this, this.GetType(), "HideConfirmBox", "javascript:HideAAConfirmBox(); ", true);
Response.Write("<scrip" + "t>test(" + x + "," + y + ");</script>");
разбивает ключевое слово script, потому что компилятор VStudio/asp.net не нравится
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Call java script function on Code behind</title>
<script type="text/javascript">
function abc()
{
var a=20;
var b=30;
alert("you enter"+a+":"+b);
}
</script>
</head>
cs code
protected void Page_Load(object sender, EventArgs e)
{
TextBox2.Attributes.Add("onkeypress", "return abc();");
}
попробуйте это
Я думаю, что вы хотите выполнить javascript serveride, а не в браузере после post-back, правильно?
Это невозможно, насколько я знаю
Если вы просто хотите его выполнить после обратной передачи, вы можете сделать что-то вроде этого:
this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "xx", "<script>test("+x+","+y+");</script>");
Если вы заинтересованы в обработке Javascript на сервере, есть новая библиотека с открытым исходным кодом, называемая Jint, который позволяет выполнять Javascript на стороне сервера. В основном это интерпретатор Javascript, написанный на С#. Я тестировал его, и пока он выглядит довольно многообещающим.
Здесь описание с сайта:
Различия с другими двигателями script:
Jint отличается, поскольку он не используется Техника CodeDomProvider, которая используя компиляцию под капотом и таким образом, приводит к утечкам памяти, поскольку скомпилированные сборки не могут быть выгружены. Более того, используя эту технику предотвращает использование динамических типов переменные, как это делает JavaScript, обеспечивая большую гибкость в скрипты. Напротив, Джинт вставляет он владеет логикой синтаксического анализа и действительно интерпретирует сценарии. Jint использует известный ANTLR (http://www.antlr.org) библиотеки для этой цели. Поскольку он использует Javascript как язык, на котором вы не должны выучить новый язык, он оказалась очень сильной для сценариев, и вы можете использовать несколько текстовых редакторов для синтаксиса проверка.
<head>
<script type="text/javascript">
function test(x, y)
{
var cc = "";
for (var i = 0; i < x.length; i++)
{
cc += x[i];
}
cc += "\ny: " + y;
return cc;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" Text="Button" />
<p>
<asp:TextBox ID="TextBox1" Name="TextBox1" runat="server" AutoPostBack="True" TextMode="MultiLine"></asp:TextBox>
</p>
</form>
</body>
protected void Page_Load(object sender, EventArgs e)
{
int[] x = new int[] { 1, 2, 3, 4, 5 };
int[] y = new int[] { 1, 2, 3, 4, 5 };
string xStr = getArrayString(x); // converts {1,2,3,4,5} to [1,2,3,4,5]
string yStr = getArrayString(y);
string script = String.Format(" var y = test({0},{1}) ; ", xStr, yStr);
script += String.Format(" document.getElementById(\"TextBox1\").value = y ");
this.Page.ClientScript.RegisterStartupScript(this.GetType(), "testFunction", script, true);
// this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "testFunction", script, true); // different result
}
private string getArrayString(int[] array)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < array.Length; i++)
{
sb.Append(array[i] + ",");
}
string arrayStr = string.Format("[{0}]", sb.ToString().TrimEnd(','));
return arrayStr;
}