2009-08-14 19 views
5

Estoy intentando aprender asp.net (vb.net) y estoy teniendo problemas. Quiero cambiar el contenido de una página en función de la cadena de consulta.Mostrando resultados completamente diferentes basados ​​en la cadena de consulta

En ASP clásico que haría:

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

-entire page-

<% Else %> 

-diferente page-

<% End If %>  

Lo más cerca que pude conseguir en .NET es

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 

Eso solo parece bueno para cosas pequeñas. ¿Cuál sería el mejor método para cambiar una página completa?

+0

¿Cómo que cambiar toda la página? Todas sus páginas de contenido se pueden hacer dentro de Page_Load u otras funciones a las que llama desde Page_Load. Si usa controles ASP, después de llamar a Page_Load, activará los eventos para esos controles (como Button.Click) – JamesMLV

Respuesta

6

Se podría hacer lo siguiente (redirección sencilla):

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

También puede hacer esto (leer más here):

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

Y por último una opción más (mostrar/ocultar diferentes paneles en la página):

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

@womp: Me acaban de dar con -4 en 20 segundos ... Su publicación en realidad no se ajusta al cuenta. Ver mi nota. – RSolberg

+0

Quizás no fuiste tú ... cada mensaje perdió un voto, y noté que perdiste 6 rep ... disculpas. – womp

+0

@womp: no me preocupo, odio el sistema de juego aquí ... Sé que la gente regresa y cuarto en META, pero cuando pierdes 4 puntos en cuestión de 20 segundos sin explicación sobre por qué, es muy sospechoso – RSolberg

1

Realmente tiene algunas opciones, podría:

  • Response.Redirect (url) a una página diferente según la entrada.

  • Puede tener un ASP: Panel con la propiedad "visible" establecida en falso y alternar ese valor según la entrada.

+1

o una vista múltiple en lugar del panel. –

+0

MultiView es probablemente más adecuado para esto, sí .. – Juri

4

se recomienda usar el MultiView control.

En pocas palabras, crearía dos "vistas" de vistas múltiples, cada una con el html que desea mostrar. Luego, podría ver el parámetro querystring y cambiar la vista activa de la vista múltiple en consecuencia.

Esto tiene muchas ventajas para Response.Redirect() como otros sugeridos. En primer lugar, eso generaría siempre al menos dos solicitudes de navegador. Además, Response.Redirect() arroja una excepción ThreadAborted detrás de las escenas, lo que puede confundir a las personas que diagnostican la aplicación.

de control

Ejemplo 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> 

Código:

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

Parece mucho como C# mientras la persona preguntaba sobre VB – RSolberg

+0

Cambió a VB. No vale la pena un voto negativo. – womp

+0

Y así hasta el voto deberá reflejar dicho cambio;) – RSolberg

1

Por qué no usar diferentes archivos en su lugar? redirigir a diferentes páginas. Eso evitaría tener que tener declaraciones if en todas partes.

O

poner sus datos en paneles y simplemente ocultar una o la otra panel1.visible = (verdadero/falso). Eso es lo mejor que puede hacer si tiene que tenerlo todo en la misma página aspx.

0

Para referencia futura, puede utilizar la clásica forma de ASP para controlar el contenido. Aquí hay una página ASPX que escribí hace un momento:

<%@ 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> 

Cuando la página se muestra, muestra '¿Qué?' en la pagina.

Sin embargo, ¡diría que esto es una mala práctica y un diseño deficiente! Utilice la sugerencia de womp de una vista múltiple o una redirección de página.

0

Yo prefiero hacerlo en la página ASPX usando 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> 

A continuación, en el lado del servidor:

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