Передающие аргументы JavaScript функционируют из кода - позади

Не забывайте делать деструктор базового класса virtual, если вы планируете выводить классы из него.

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

class Base
{
public:
    Base() {}
    virtual ~Base() { std::cout << "Base Destructed" << std::endl; }

    virtual void f() {}
};

Но стоит отметить, что вы не ставите виртуальные перед функциями, которые вы не собираетесь переопределять. Потому что это связано с дополнительными затратами на обслуживание виртуальной таблицы.

https://www.crashhandler.com/2019/03/make-destructors-destroy-virtually.html Это моя запись в блоге на эту тему.

11
задан abatishchev 6 October 2011 в 11:53
поделиться

6 ответов

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

10
ответ дан 3 December 2019 в 02:30
поделиться

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

Редактировать:

Собственно, функция вероятно, вы хотите ScriptManager.RegisterClientScriptBlock

10
ответ дан 3 December 2019 в 02:30
поделиться

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

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

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

, потому что он вызывает методы ToString () для x и y, что возвращает " System.Int32 [] ", и, очевидно, Javascript не может это использовать. Мне приходилось передавать массивы в виде строк, например «[1,2,3,4,5]», поэтому я написал вспомогательный метод для выполнения преобразования.

Кроме того, между ними есть разница. Страница. ClientScript.RegisterStartupScript () и this.Page.ClientScript.RegisterClientScriptBlock () - первый размещает скрипт внизу страницы, который мне нужен для доступа к элементам управления (например, с document.getElementByID). RegisterClientScriptBlock () выполняется до визуализации тегов, поэтому я действительно получаю ошибку Javascript, если использую этот метод.

http: //www.wrox. ru / WileyCDA / Section / Manipulation-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>
6
ответ дан 3 December 2019 в 02:30
поделиться
Response.Write("<scrip" + "t>test(" + x + "," + y + ");</script>");

breaking up the script keyword because VStudio / asp.net compiler doesn't like it

2
ответ дан 3 December 2019 в 02:30
поделиться

I think you want to execute the javascript serverside and not in the browser after post-back, right?

That's not possible as far as I know

If you just want to get it execute after postback, you can do something like this:

this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "xx", "<script>test("+x+","+y+");</script>");
0
ответ дан 3 December 2019 в 02:30
поделиться

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

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

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

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

0
ответ дан 3 December 2019 в 02:30
поделиться