2012-06-19 5 views
0

В моем приложении asp.net две кнопки вызывают функцию javascript с именем refreshView, ниже показана функция refreshView.__doPostBack не работает в сафари или firefox, работает в IE

function RefreshView() { 
         __doPostBack('ButtonApply', '') 
         window.parent.location.href = "dashboardtree.aspx" 
        } 

В IE это работает правильно, но в Firefox и сафари страница обновляется (из-за window.parent.location) - но никогда не называет doPostBack (я был в состоянии сказать это с помощью точек трассировки и sub, который называется хранением значений в базе данных, значения также не сохраняются, sub никогда не попадает). Ниже приведена первая строка sub.

Private Sub ButtonApply_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonApply.Click 

Может ли кто-нибудь понять, почему это не сработает? Я решил, что всегда могу заменить doPostBack на pageMethods и создать новую функцию sub /, но я хотел бы завершить это так, как сейчас. Спасибо.

ответ

3

Не выполняйте перенаправление и обратную связь одновременно в своей программе JavaScript. Вместо этого вы должны перенаправить после завершения логики обратной передачи. Вы будете знать только, когда он будет завершен в Codebehind, или если ваш Javascript получил какой-то асинхронный обратный вызов. В текущем состоянии ваша JavaScript-процедура не имеет понятия, когда ваш Postback завершится.

Вы создаете конфликт. То, что вы по существу делаете, - это сообщение на страницу для публикации и в то же время перенаправление в другое место. По всей вероятности, FireFox и Safari, вероятно, проигнорировали __doPostBack() из-за этого факта.

Вот что я хотел бы сделать вместо:

public void Page_Load(object sender, EventArgs e) 
{ 
    string target = Request["__EVENTTARGET"]; 
    //if parameter equals "ButtonApply" 
    //{  
    // Do whatever, Then... 
    // Response.Redirect("dashboardtree.aspx"); <- you may need to modify the url depending on your structure 
    //} 
} 

EDIT

...about the response.redirect - this will not work for me because the page that contains the post back, is an iframe inside another page... 

Извиняюсь, я пропустил window.parent.

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

Есть несколько примеров этого в Интернете, я приведу несколько для вас:

+0

Вы правы, удалив window.parent.location.href позволит удалять суб. Теперь, как я могу получить страницу для обновления, как если бы вы нажали кнопку обновления? Сообщение назад или нет, не имеет значения, так как сбой был удален с помощью doPostBack и сохранил значения, которые мне нужны для db, эти значения возвращаются обратно из db во время загрузки страницы. – njj56

+0

об ответе.redirect - это не сработает для меня, потому что страница, содержащая сообщение назад, является iframe внутри другой страницы, раньше я использовал window.parent.location.href для этого, но что я должен использовать вместо этого? Мне нужно обновить родительский, а не текущий. – njj56

+0

Извиняюсь, я пропустил окно. Тогда вам было бы лучше использовать ajax для вызова метода для выполнения вашей обработки вместо обратной передачи. Затем вы получите ответ от ajax после завершения. Как только вы получите обратный вызов ajax, вы будете делать перенаправление window.parent. – Jeremy

0

Для того, чтобы выполнить метод после завершения каждой обратной передачи вы можете добавить этот метод в список обработчиков через PageRequestManager. (см.: http://msdn.microsoft.com/en-us/library/bb311028) После выполнения метода вы можете удалить его из списка обработчиков, если это необходимо.

function Reload() { 
    Sys.WebForms.PageRequestManager.getInstance().remove_pageLoaded(Reload); 
    window.parent.location.href = "dashboardtree.aspx"; 
} 

function RefreshView() { 
    Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(Reload); 
    __doPostBack('ButtonApply', ''); 
} 

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

  • Нет связанных вопросов^_^