2009-04-23 17 views
7

Obecnie utknąłem. Mam formularz internetowy z przyciskiem, który rejestruje lub zapisuje rekord. To, co chcę, to wyświetlić alert javascript, a następnie przekierowanie do strony. Oto kod używamAlert wyświetlania formularza sieci Web Asp.net i przekierowanie

protected void Save(..) 
{ 
    // Do save stuff 
    DisplayAlert("The changes were saved Successfully"); 
    Response.Redirect("Default.aspx"); 
} 

Ten kod po prostu przekierowuje bez podania wiersz zapisany pomyślnie.

Oto mój kod DisplayAlert

protected virtual void DisplayAlert(string message) 
    { 
     ClientScript.RegisterStartupScript(
         this.GetType(), 
         Guid.NewGuid().ToString(), 
         string.Format("alert('{0}');", message.Replace("'", @"\'").Replace("\n", "\\n").Replace("\r", "\\r")), 
         true 
        ); 
    } 

Czy ktoś może mi pomóc znaleźć rozwiązanie tego?

Dzięki

Odpowiedz

7

nie można zrobić Response.Redirect, ponieważ javascript alert nigdy nie będzie wyświetlana. Lepiej mieć kod javascript, który faktycznie wykonuje windows.location.href='default.aspx', aby wykonać przekierowanie po wyświetleniu alertu. Coś takiego:

protected virtual void DisplayAlert(string message) 
{ 
    ClientScript.RegisterStartupScript(
     this.GetType(), 
     Guid.NewGuid().ToString(), 
     string.Format("alert('{0}');window.location.href = 'default.aspx'", 
     message.Replace("'", @"\'").Replace("\n", "\\n").Replace("\r", "\\r")), 
     true); 
} 
+0

Dzięki Keltex! Spróbuję tego. – AlteredConcept

4

Metoda DisplayAlert dodaje skrypt klienta do aktualnie wykonywanego żądania strony. Po wywołaniu Response.Redirect, ASP.NET wydaje przekierowanie HTTP 301 do przeglądarki, rozpoczynając zatem nowe żądanie strony, w którym zarejestrowany skrypt klienta już nie istnieje.

Ponieważ twój kod jest wykonywany po stronie serwera, nie ma możliwości wyświetlenia alertu po stronie klienta i wykonania przekierowania.

Ponadto wyświetlanie pola alertu JavaScript może być mylące dla mentalnego przepływu pracy użytkownika, dlatego wiadomość typu inline byłaby znacznie bardziej pożądana. Być może możesz dodać wiadomość do sesji i wyświetlić ją na żądanie strony Default.aspx.

protected void Save(..) 
{ 
    // Do save stuff 
    Session["StatusMessage"] = "The changes were saved Successfully"; 
    Response.Redirect("Default.aspx"); 
} 

Następnie w kodzie Default.aspx.cs za (lub klasy widoku wspólne podstawy tak to może zdarzyć się na każdej stronie, a nawet strona główna):

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!string.IsNullOrEmpty((string)Session["StatusMessage"])) 
    { 
     string message = (string)Session["StatusMessage"]; 
     // Clear the session variable 
     Session["StatusMessage"] = null; 
     // Enable some control to display the message (control is likely on the master page) 
     Label messageLabel = (Label)FindControl("MessageLabel"); 
     messageLabel.Visible = true; 
     messageLabel.Text = message; 
    } 
} 

Kod nie jest testowane, ale powinien wskazać we właściwym kierunku

1
protected void Save(..) 
{  
    // Do save stuff  
    ShowMessageBox(); 
} 

private void ShowMessageBox() 
{   
    string sJavaScript = "<script language=javascript>\n";   
    sJavaScript += "var agree;\n";   
    sJavaScript += "agree = confirm('Do you want to continue?.');\n";   
    sJavaScript += "if(agree)\n";   
    sJavaScript += "window.location = \"http://google.com\";\n";   
    sJavaScript += "</script>";  
    Response.Write(sJavaScript); 
} 
4

działa to idealny:

string url = "home.aspx"; 
ClientScript.RegisterStartupScript(this.GetType(), "callfunction", "alert('Saved Sucessfully.');window.location.href = '" + url + "';",true); 
+0

Idealnie! Dzięki –

+0

Jeśli robisz to z poziomu kontrolki, może być konieczne dodanie 'Strony.' Przed 'ClientScript' tak jak poniżej:' Page.ClientScript ... ' –

Powiązane problemy