2011-01-21 1 views
1

В заключение:Как сгенерировать JavaScript во время обратного вызова AJAX (postback), а затем выполнить его в браузере?

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

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

Как «приятно иметь», я хочу отображать либо зеленый круг, либо красный крест рядом с каждым элементом (они различаются в зависимости от каждого элемента). Поскольку пользователю не важно видеть эти значки, а также потому, что для каждого элемента требуется несколько секунд, какой значок должен отображаться для каждого элемента, я хочу выполнить это после загрузки страницы, поэтому в обратном вызове 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 для изменения отображения всех значков, которые я хочу отобразить.

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

Я также попытался:

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

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

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

Error: uncaught exception: [Exception... "Node cannot be inserted at the specified point in the hierarchy" code: "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 Line: 1075"]

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

Если нет - какая у меня альтернатива?

Спасибо

+0

Вы должны добавили свой вопрос в AXAX теге – Wazzzy

ответ

0

Хорошо

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

Не удалось получить, чтобы работать ....

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

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

1

Поскольку ваш сценарий не имеет ограждающих <script> теги, вам нужно использовать this form of RegisterStartupScript:

ScriptManager.RegisterStartupScript(this, this.GetType(), "uniqueKey", jscript, true); 
+0

Извинения - да, я пытался сделать это с «правда» аргумент, чтобы генерировать теги сценария, но не повезло .... также создает о чем я упоминал выше. – DrGriff

+1

Кажется, что может возникнуть конфликт с собственным менеджером сценариев telerik. Вы пытались использовать свой собственный метод RadScriptManager.RegisterStartupScript? –

1

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

The idea was that the page would load, data would be sent (AJAX) to the server. The server would then generate some JavaScript based upon this data and send that back to the page. That JavaScript would then run updating the page in a specific way.

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

Дано:

<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

+0

Брайан - ** отличный пост **, спасибо. Один вопрос: сколько обработчиков событий конечного запроса может быть на странице? Это большое веб-приложение с множеством компонентов AJAX telerik - некоторые на главной странице - и это событие уже может быть обработано .... Я не могу перезаписать существующие обработчики событий. – DrGriff

+0

Ответил на мой вопрос .... кажется, что вы можете создать столько, сколько вам нужно. Я создал два, и оба они выстрелили в последовательности, которую они определили. – DrGriff

+0

@DrGriff - вы правы - сколько угодно. Я уверен, что есть практические ограничения для производительности, но я их никогда не ударил :) – Brian

Смежные вопросы