Sys.Application.add_load Проблема с модальным расширителем всплывающих окон

У меня текущая проблема, давайте объясним контекст раньше:

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

Я хочу, чтобы это модальное всплывающее окно снова появилось на странице page_load, позволяя пользователю вводить новые данные, не нажимая повторно кнопку, которая отображает это модальное всплывающее окно.

Сначала я попытался назвать это так:

ClientScript.RegisterStartupScript(Page.GetType(), "ModalPopup", "ShowModalPopup(""" & Me.formModalButton.ID & """);", True)

но проблема заключалась в том, что когда функция вызывалась, мое модальное всплывающее окно еще не существовало на странице. Из-за этого код на

var modal = $find('myModal');

Итак, я нашел другой способ, и он работает почти идеально.

ClientScript.RegisterStartupScript(Page.GetType(), "ModalPopup", "Sys.Application.add_load(function() {ShowModalPopup(""" & Me.formModalButton.ID & """)};", True)

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

Пример: у меня есть еще одно модальное всплывающее окно для удаления данных, когда я нажимаю на кнопку, появляются оба модальных окна, что не круто.

Кто-нибудь знает, как это исправить или как это сделать лучше?

P.S. Я не вызываю модальное всплывающее окно на стороне сервера, потому что функция javascript существует на странице, поэтому я не хочу создавать копию этой функции в RegisterStartupScript.

Спасибо за ваше время.


person ForceMagic    schedule 12.02.2009    source источник


Ответы (2)


Используйте приведенный ниже фрагмент кода

//Declares gloabal variable
ClientScript.RegisterStartupScript(Page.GetType(),"vardeclaration","var reloadModal;",true);

ClientScript.RegisterStartupScript(Page.GetType(), "ModalPopup", "Sys.Application.add_load(

function() 
{
   reloadModal = function() {ShowAddModalPopup(""" & Me.imgAdd.ID & """);};
   Sys.Application.add_init(reloadModal);
}
);", True)

Это позволит вам использовать

function cancelClick()
{
   Sys.application.remove_init(reloadModal);
}
person Ramesh    schedule 12.02.2009
comment
Здравствуйте, сначала спасибо за ответ. К сожалению, если я использую Sys.Application.add_init вместо add_load, у меня будет та же проблема, что и раньше, мой модальный расширитель всплывающих окон не существует при вызове функции, поэтому я получил исключение нулевой ссылки на $ find ('myModal '). - person ForceMagic; 12.02.2009
comment
@ForceMagic: Извините, я неправильно это понял. Разве вы не можете зарегистрировать этот скрипт только при нажатии определенной кнопки на стороне сервера? - person Ramesh; 12.02.2009
comment
Да, я могу это сделать, но проблема остается после регистрации сценария. Может стоит попробовать Разгрузить по кнопке Отмена. С Sys.application.remove_load На самом деле, когда пользователь нажимает кнопку «Отмена», сценарий остается там, поэтому при щелчке на странице снова появляется всплывающее окно Modal. - person ForceMagic; 12.02.2009
comment
Можете ли вы удалить скрипт на стороне клиента, прежде чем выполнять обратную передачу? - person Ramesh; 12.02.2009
comment
Думаю смогу, попробую! на самом деле я немного изменил способ вызова функции, и ваше предложение для add_init работает !!! так что попробую снять с нагрузки по кнопке отмены! Я отправлю свое решение, если оно сработает! :) - person ForceMagic; 12.02.2009
comment
Да, я все еще застрял на удалении сохраненной функции после первого вызова. Я имею в виду, когда он снова показывает мне модальное всплывающее окно на странице page_load, если я нажимаю на отмену, скрипт остается там, а при любом другом щелчке он появляется снова. Вы хотите, чтобы я отправил свой код в тент, чтобы узнать, не могли бы вы помочь? Спасибо - person ForceMagic; 12.02.2009
comment
Привет ! У меня плохие новости и хорошие новости: P Хорошие новости, ваш код работает хорошо! Я научился объявлять глобальную функцию. Плохая новость, даже если я вызываю remove_init (reloadModal), поведение все еще сохраняется, когда я нажимаю на другую кнопку одновременно. Может, это не лучший способ делать то, что мне нужно? - person ForceMagic; 12.02.2009
comment
Да, так же. Я сейчас в замешательстве. Если что-то происходит Async, он не должен закрывать модальный браузер при нажатии кнопки отправки. - person Ramesh; 12.02.2009
comment
Да, я слишком серьезно запутала меня. Думаю, я понимаю, что после Sys.Application.add_init, поскольку у меня есть другой автоматически сгенерированный код JavaScript на той же странице, возникает ошибка с ScriptManager. Я думаю, он каждый раз вызывает модальное всплывающее окно после того, как я зарегистрирую его на стороне клиента. - person ForceMagic; 13.02.2009
comment
Это единственное, что я мог вообразить. Возможно, мой собственный javascript мешает текущему javascript, сгенерированному ScriptManager. На самом деле, даже на Forum.Asp.Net я не видел никого, кто использовал бы модальные всплывающие окна так часто, как я, и так сильно настраивал, как я. Я действительно невежественен :( - person ForceMagic; 13.02.2009

Наконец, я нашел способ решения моей текущей проблемы.

Я все еще использую ClientScript.Resgister [...], но на этот раз я также изменяю функцию OnClientClick Javascript моей кнопки отмены.

Поэтому, когда парень выбирает функцию «Сохранить и добавить новую», когда страница перезагружается и модальное окно отображается снова, если он нажимает «Отмена», я выполняю обратную передачу на сервер, чтобы перезагрузить страницу и решить эту странную проблему.

Я также думаю, что проблема могла возникнуть из-за другой панели обновлений в моем коде, но они мне нужны для работы Modal Popup Extender.

Во всяком случае, я обнаружил, что это работает даже не в Opera и Safari, а в целом (инструментарий Ajax Control - модальный расширитель всплывающих окон).

Вполне вероятно, что компания здесь не заботится о других и официально поддерживает только IE. В моем случае я хочу, чтобы он работал хотя бы в FF и Chrome.

ClientScript.RegisterStartupScript(Page.GetType(), "ModalPopup", "Sys.Application.add_load(function() {ShowAddModalPopup(""" & Me.imgAdd.ID & """)});", True)
                btnCancel.OnClientClick = "resetDefaultValue();__doPostBack('" & btnCancel.ID & "','onclick')"

Итак, есть код, также в FF появляется еще одна ошибка,

Sys.WebForms.PageRequestManagerServerErrorException: при обработке запроса на сервере произошла неизвестная ошибка. Код состояния, возвращенный сервером, был: 0

И я нашел это решение, оно не самое лучшее, но я потерял достаточно времени с этим ...

ClientScript.RegisterStartupScript(Page.GetType(), "WorkAroundFF", "Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest); function endRequest(sender, args) { /* Check to see if there's an error on this request.*/ if (args.get_error() != undefined) { $get('Error').style.visibility = ""visible""; /* Let the framework know that the error is handled, so it doesn't throw the JavaScript*/ alert. args.set_errorHandled(true); } }", True)

Так что спасибо за вашу помощь, Рамеш, я почти уверен, что ваше решение сработало бы, если бы не мои панели обновлений.

Надеюсь, что это может помочь кому-то другому.

person ForceMagic    schedule 13.02.2009
comment
На самом деле, я также думаю, что тот факт, что я все еще использую VS2005 на framework 2.0, может вызвать больше проблем. Наш Ajax Control Toolkit находится не в последней версии, поэтому я думаю, что отключу эту функцию на данный момент и протестирую ее позже на VS2008, потому что у меня есть другие ошибки, и я уверен, что они на их стороне. - person ForceMagic; 13.02.2009