2009-08-14 15 views
5

Sto cercando di imparare asp.net (vb.net) e ho qualche problema. Voglio cambiare il contenuto di una pagina in base alla querystring.Visualizzazione di output completamente diverso in base alla stringa di query

In ASP classico farei:

<% If request.querystring("page") = 1 THEN %> 

-entire PAGE-

<% Else %> 

-Different PAGE-

<% End If %>  

Il più vicino ho potuto ottenere in NET è

Sub Page_Load(ByVal Sender as Object, ByVal E as EventArgs) 
     If Request.QueryString("page") = 1 Then 
      lblMessage1.Text = "message" 
     Else 
      lblMessage1.Text = "message2" 
     End If 
End Sub 

Questo sembra buono solo per le piccole cose. Quale sarebbe il metodo migliore per cambiare un'intera pagina?

+0

Cosa intendi cambiare l'intera pagina? Tutte le pagine di contenuto possono essere eseguite in Page_Load o altre funzioni chiamate da Page_Load. Se usi i controlli ASP, dopo aver chiamato Page_Load, attiverà quindi gli eventi per quei controlli (come Button.Click) – JamesMLV

risposta

6

Si potrebbe fare la seguente (semplice redirect):

If Request.QueryString("page") = 1 Then 
    Response.Redirect("MyPage1.aspx") 
Else 
    Response.Redirect("MyPage2.aspx") 
End If 

Si potrebbe anche fare questo (leggi here):

If Request.QueryString("page") = 1 Then 
    Server.Transfer("MyPage1.aspx") 
Else 
    Server.Transfer("MyPage2.aspx") 
End If 

E infine un'altra opzione (mostra/nascondere i pannelli diversi nella pagina):

If Request.QueryString("page") = 1 Then 
    MyPanel1.Visible = true 
    MyPanel2.Visible = false 
Else 
    MyPanel1.Visible = false 
    MyPanel2.Visible = true 
End If 
+0

@womp: Sono appena stato colpito da -4 in 20 secondi ... Il tuo post non si adatta in realtà al conto. Vedi il mio messaggio. – RSolberg

+0

Forse non eri tu ... ogni post ha perso un voto, e ho notato che hai lasciato cadere 6 rep ... scuse. – womp

+0

@womp: non preoccuparti, odio il sistema di gioco che succede qui ... So che la gente torna indietro e la quarta su META, ma quando perdi 4 punti nel giro di 20 secondi senza alcuna spiegazione perché, è molto pescoso. – RSolberg

1

È veramente un paio di opzioni, si potrebbe:

  • Response.Redirect (url) a una pagina diversa in base all'input.

  • Si può avere un ASP: il pannello con la proprietà "visible" è impostato su false e commuta tale valore in base all'input.

+1

Oppure una MultiView anziché il Pannello. –

+0

MultiView è probabilmente più adatto a questo, sì .. – Juri

4

Io suggerirei di usare il MultiView control.

In breve, si creerebbero due "Visualizzazioni" a vista multipla, ciascuna con l'html che si desidera mostrare. Quindi è possibile osservare il parametro querystring e modificare di conseguenza la vista attiva della vista multipla.

Questo ha molti vantaggi a Response.Redirect() come suggerito da altri. Innanzitutto, genererebbe sempre almeno due richieste del browser. Inoltre, Response.Redirect() genera un'eccezione ThreadAborted dietro le quinte, che può confondere le persone che diagnosticano l'applicazione.

controllo

Esempio MultiView:

ASPX:

<form id="form1" runat="server"> 
    <div> 
    <asp:MultiView ID="MultiView1" runat="server"> 
     <asp:View runat="server"> 
     Hi, this is Page 1 
     </asp:View> 
     <asp:View runat="server"> 
     Hi, this is Page 2 
     </asp:View> 
    </asp:MultiView>  
    </div> 
    </form> 

Codice:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) 
      If Request.QueryString("page") = "1" Then 
       MultiView1.ActiveViewIndex = 0 
      Else 
       MultiView1.ActiveViewIndex = 1 
      End If 
End Sub 
+0

Sembra molto simile a C# mentre la persona stava chiedendo di VB – RSolberg

+0

modificato in VB. Difficilmente vale un downvote. – womp

+0

E così l'up-voto rispecchia un tale cambiamento;) – RSolberg

1

perché non utilizzare file diversi, invece? reindirizzare a pagine diverse. Questo eviterebbe di dover avere se dichiarazioni ovunque.

O

mettere i dati in pannelli e solo nascondere uno o l'altro panel1.visible = (true/false). Questa è la cosa migliore da fare se devi avere tutto nella stessa pagina di aspx.

0

Per riferimento futuro, è ancora possibile utilizzare il classico modo ASP per controllare il contenuto. Ecco una pagina ASPX che ho appena scritto:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
<% 
    if (3 == 9) 
    {%> 
    <span>Hello</span> 
    <% 
    } 
    else 
    { 
    %> <span>What?</span > <% 
    } 

    %> 

    </div> 
    </form> 
</body> 
</html> 

Quando la pagina esegue il rendering, visualizza "Cosa?" sulla pagina.

Tuttavia, direi che questa è una cattiva pratica e un design scadente! Utilizzare il suggerimento di Womp di una vista multipla o un reindirizzamento della pagina.

0

preferisco farlo sulla pagina ASPX utilizzando DataBinding:

<asp:PlaceHolder runat="server" ID="Messages"> 
    <asp:Label runat="server" Visible=<%# Request.QueryString("page") = 1 %> Text="Message 1" />  
    <asp:Label runat="server" Visible=<%# Request.QueryString("page") <> 1 %> Text="Message 2"/> 
</asp:PlaceHolder> 

Poi sul lato server:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)    
    Messages.DataBind() 
End Sub 
Problemi correlati