Передача аргументов в функцию JavaScript из кода - PullRequest
11 голосов
/ 25 апреля 2009

Я хотел бы вызвать функцию 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);
}

Есть ли способ сделать это?

Ответы [ 9 ]

10 голосов
/ 25 апреля 2009

Вы можете использовать метод Page.ClientScript.RegisterStartupScript .

10 голосов
/ 25 апреля 2009

Посмотрите на метод ScriptManager.RegisterStartupScript , если вы используете ScriptManager или любые управляющие / асинхронные обратные передачи Ajax.

Edit:

На самом деле, вероятно, вам нужна функция ScriptManager.RegisterClientScriptBlock

6 голосов
/ 26 апреля 2009

Некоторые другие вещи, которые я узнал:

Вы не можете напрямую передать массив как:

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 () - первый размещает скрипт внизу страницы, который мне нужен, чтобы иметь возможность для доступа к элементам управления (например, с 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>
3 голосов
/ 29 апреля 2011

включает менеджер скриптов

код функции

ScriptManager.RegisterStartupScript(this, this.GetType(), "HideConfirmBox", "javascript:HideAAConfirmBox(); ", true);
2 голосов
/ 25 апреля 2009
Response.Write("<scrip" + "t>test(" + x + "," + y + ");</script>");

разрыв ключевого слова script, поскольку компилятору VStudio / asp.net это не нравится

1 голос
/ 09 января 2011
<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

protected void Page_Load(object sender, EventArgs e)
{
    TextBox2.Attributes.Add("onkeypress", "return abc();");
}

попробуйте это

0 голосов
/ 24 марта 2013
 <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;
}
0 голосов
/ 10 июня 2010

Если вы заинтересованы в обработке Javascript на сервере , есть новая библиотека с открытым исходным кодом под названием Jint , которая позволяет выполнять Javascript на стороне сервера. По сути, это интерпретатор Javascript, написанный на C #. Я тестировал его, и пока он выглядит многообещающим.

Вот описание с сайта:

Отличия от других скриптовых движков:

Jint отличается тем, что не использует Метод CodeDomProvider, который является используя сборник под капотом и таким образом приводит к утечкам памяти как скомпилированные сборки не могут быть выгружены. Более того, используя эту технику предотвращает использование динамических типов переменные, как JavaScript, позволяя больше гибкости в вашем скрипты. Наоборот, Jint встраивает это своя логика синтаксического анализа, и на самом деле интерпретирует сценарии. Джинт использует знаменитый АНТЛР (http://www.antlr.org) библиотека для этого. Как это использует Javascript как его язык вы не нужно выучить новый язык, у него есть оказался очень мощным для сценарии, и вы можете использовать несколько текстовых редакторов для синтаксиса проверка.

0 голосов
/ 25 апреля 2009

Я думаю, что вы хотите запускать серверную часть javascript, а не в браузере после постбэка, верно?

Насколько я знаю, это невозможно

Если вы просто хотите, чтобы он выполнялся после обратной передачи, вы можете сделать что-то вроде этого:

this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "xx", "<script>test("+x+","+y+");</script>");
...