2009-03-04 2 views

ответ

14

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

Когда ваше событие SelectedIndexChanged срабатывает на сервере, оно срабатывает как часть полной обратной передачи. Это означает, что для запуска этого кода также должен был работать весь остальной код загрузки вашей страницы.

Более того, код запускается в результате нового HTTP-запроса из браузера. Что касается браузера, в результате возвращается совершенно новая страница. Старая страница и старый DOM отбрасываются. Таким образом, в момент запуска вашего кода события SelectedIndexChanged функция javascript, которую вы хотите вызвать, даже не существует в браузере.

Так что же вместо этого делать? У вас есть несколько вариантов:

  • Измените страницу, чтобы элемент управления не отправлялся обратно на сервер вообще. Обнаружить изменение полностью в javascript на клиенте. Это мой предпочтительный вариант, поскольку он позволяет избежать нечетных скриптов onload на странице браузера, и это экономит работу для вашего сервера. Нижняя сторона заключается в том, что она заставляет вашу страницу зависеть от javascript, но это не очень важно, потому что если javascript отключен, это было обречено с самого начала.
  • Установите желаемый javascript для запуска onload в событии SelectedIndexChanged с помощью ClientScript.SetStartupScript().
  • Применить ожидаемые результаты вашего javascript к серверной модели страницы. Это имеет то преимущество, что работает даже при отключении JavaScript (доступность), но за счет гораздо большего количества работы на сервере, проводя больше времени на логическое состояние вашей страницы и, возможно, необходимо дублировать клиентскую и серверная логика. Кроме того, это событие в любом случае зависит от javascript: если javascript отключен, он не будет срабатывать.
  • Возможна некоторая комбинация первого и третьего вариантов, так что он использует javascript локально, если он доступен, но отправляется обратно на сервер, если нет. Лично я хотел бы видеть лучше, более интуитивно понятную, поддержку, встроенную в ASP.Net. Но опять же: я говорю об общем случае. Это конкретное событие требует, чтобы javascript работал вообще.
+0

Новичок теперь достаточно образован, и дает ответ на кредит соответственно ... Спасибо! :) –

1

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

Что вы можете сделать, это испустить Javascript в событии ASPX, которое вызовет функцию JavaScript при перезагрузке страницы.

Например, если на вашей странице ASPX у вас есть функция Javascript под названием «DoSomething()», в вас событие управления ASPX, добавьте следующее:

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    Page.ClientScript.RegisterStartupScript(this.GetType(), "myEvent", "DoSomething()", true); 
} 

Последний логический параметр определяет, что теги добавляются автоматически.

+0

Звучит как идея, но я понятия не имею, как вы делаете что-то подобное. Не могли бы вы уточнить, пожалуйста? –

+0

Я отредактировал свое сообщение с образцом кода, в основном Google для RegisterStartupScript(), и вы найдете массу примеров. – muerte

2

Поскольку Muerte сказал, что вам нужно просто поместить javascript или позвонить ему на странице из кода позади.Лично я использую это:

ClientScript.RegisterClientScriptBlock("customscript", "<script>simple script here</script>") 

Из вас может вызвать функцию, если у вас уже есть и более сложный на странице вместо вещей у меня есть.

0

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

MyServerDDLControl.Attributes.Add("SelectedIndexChanged", "MyClientSideFunction();"); 
Смежные вопросы