Как мне сгенерировать JavaScript во время обратного вызова AJAX (обратной передачи) и затем выполнить его в браузере? - PullRequest
1 голос
/ 21 января 2011

В итоге :

У меня есть веб-страница ASP.NET, которая вызывает обратную передачу AJAX на сервер.Когда этот обработчик событий запускается (в коде), он генерирует некоторый JavaScript, который я затем хочу запустить на клиенте.Не уверен, как этого добиться.

Подробно : у меня есть веб-страница ASP.NET с несколькими элементами, отображаемыми на странице.

Как "приятно иметь"Msgstr "я хочу отобразить зеленый кружок или красный крестик рядом с каждым элементом (они различаются в зависимости от каждого элемента).Поскольку пользователю не нужно видеть эти значки, а также потому, что для определения того, какой значок должен отображаться для каждого элемента, требуется несколько секунд, я хочу выполнить это после загрузки страницы, поэтому в обратном вызове AJAX.

Поэтому я так и думал.При создании страницы я бы создавал обе иконки рядом с каждым объектом и создавал их в стиле «скрытый».Я также запомнил бы идентификатор клиента каждого из них.

Затем, когда происходит обратный вызов, я извлекаю необходимые данные из базы данных и затем создаю функцию JavaScript, которая изменяет отображение для каждого из значков, которые я хочупоказывать из «скрытого» в «видимый».

Я думал, что смогу достичь этого, используя объект ScriptManager.

Вот очень тривиальная версия моего кода на стороне сервера (C #)

void AjaxHandler(object sender, EventArgs e)
{
// call to database
string jscript = "alert('wibble');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "uniqueKey", jscript);
}

Очевидно, здесь я просто пытаюсь получить предупреждение о срабатывании после обратной передачи ... в реальной жизни у меня была бы функция JavaScript для изменения отображения всех значков, которые я хочу отобразить.

Когда я запускаю этот код, выполняется серверный код, но на сервере ничего не происходит.

Я также пробовал:

ScriptManager.RegisterClientScriptBlock()
Page.RegisterStartupScript()
Page.RegisterClientScriptBlock()
Page.ClientScript.RegisterStartupScript()
Page.ClientScript.RegisterClientScriptBlock()

, но ни один из них не работает....

FireFox показывает следующую ошибку JavaScript:

Ошибка: необработанное исключение: [Исключение ... «Код не может быть вставлен в указанную точку в иерархии»:"3" nsresult: "0x80530003 (NS_ERROR_DOM_HIERARCHY_REQUEST_ERR) "location:" http://localhost/MyWebSiteName/Telerik.Web.UI.WebResource.axd?_TSM_HiddenField_=ctl00_RadScriptManager1_TSM&compress=1&_TSM_CombinedScripts_=%3b%3bSystem.Web.Extensions%2c+Version%3d3.5.0.0%2c+Culture%3dneutral%2c+PublicKeyToken%3d31bf3856ad364e35%3aen-US%3a3de828f0-5e0d-4c7d-a36b-56a9773c0def%3aea597d4b%3ab25378d2%3bTelerik.Web.UI%2c+Version%3d2009.3.1314.20%2c+Culture%3dneutral%2c+PublicKeyToken%3d121fae78165ba3d4%3aen-US%3aec1048f9-7413-49ac-913a-b3b534cde186%3a16e4e7cd%3aed16cbdc%3a874f8ea2%3af7645509%3a24ee1bba%3a19620875%3a39040b5c%3af85f9819 Линия: 1075 "]

Кто-нибудь знает, разрешено ли то, что я пытаюсь сделать?

Если нет - то, что моеальтернатива?

Спасибо

Ответы [ 3 ]

1 голос
/ 27 июля 2011

Вы сказали, что ваша первоначальная цель была:

Идея заключалась в том, что страница будет загружаться, данные будут отправляться (AJAX) на сервер.Затем сервер генерирует некоторый JavaScript на основе этих данных и отправляет их обратно на страницу.Затем этот JavaScript будет запускать обновление страницы определенным образом.

Вот способ, которым вы можете сделать это:

учитывая:

<asp:ScriptManager runat="server" ID="scriptManager">
</asp:ScriptManager>
<script type="text/javascript">

    function endRequestHandler(sender, args) {
        var dataItems = args.get_dataItems();
        for(var key in dataItems){
            if(/^javascript:/.test(dataItems[key])){
                eval(dataItems[key].substring("javascript:".length));
            }
        }
    }
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);

</script>

<asp:UpdatePanel runat="server" ID="pnl">
    <ContentTemplate>
        <asp:Button runat="server" ID="btnClick" Text="Click me!" OnClick="btnClick_Click" />
    </ContentTemplate>
</asp:UpdatePanel>

Вы можете создатьобработчик кликов, который делает это:

protected void btnClick_Click(object sender, EventArgs e)
{
    ScriptManager.GetCurrent(Page).RegisterDataItem(this, "javascript:alert('hello world!');");
}

Что происходит во время обратной передачи, диспетчеру запросов страницы отправляется элемент данных с вашим кодом.Этот элемент данных является командой javascript.После обратной передачи обработчик endRequest диспетчера сценариев на стороне клиента проверяет элементы данных.Обычно вы хотите узнать, для кого предназначены эти элементы, что видно по ключу элемента (это идентификатор клиента элемента управления, который является целью отправляемых данных).В вашем случае вы можете загрузить это с помощью javascript, который вы хотите запустить, сказать себе, что это javascript, потому что он добавлен, а затем динамически оценивать сценарий.

Так что в этом примере нажмите «Click Me»!»Кнопка сгенерирует подсказку Hello World, сценарий которой фактически был создан выделенным кодом во время обратной передачи.

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

Удачного кодирования.

B

1 голос
/ 21 января 2011

Поскольку в вашем сценарии нет тегов <script>, вам необходимо использовать эту форму RegisterStartupScript :

ScriptManager.RegisterStartupScript(this, this.GetType(), "uniqueKey", jscript, true);
0 голосов
/ 27 июля 2011

Хорошо

Идея заключалась в том, что страница будет загружаться, данные будут отправляться (AJAX) на сервер.Затем сервер генерирует некоторый JavaScript на основе этих данных и отправляет их обратно на страницу.Затем этот JavaScript будет запускать обновление страницы определенным образом.

Не удалось заставить это работать ....

Я справился с этим следующим образом:

Когда страница загружается, данные отправляются (AJAX) на сервер.Это обрабатывает данные и сериализует результаты, обновляя скрытый текстовый элемент, который возвращается в браузер.Между тем у меня есть таймер JavaScript на странице, который запускает функцию JavaScript, которая была сгенерирована при первой загрузке страницы.Эта функция смотрит на скрытый текстовый элемент.Если этот элемент имеет текст (результат обратной передачи), он отключает таймер, десериализует данные и затем выясняет, как обновить страницу.

...