2010-06-29 20 views
5

Estoy escribiendo un código que imita el efecto de hacer una devolución de datos a una página ejecutando exactamente la misma solicitud web que se generaría al hacer clic en un botón que activa la devolución de la página.¿Cómo sabe una página de asp.net qué botón desencadenó una devolución de datos?

El problema es que la respuesta de la solicitud web no es la misma que obtengo al hacer clic en el botón.

Al investigar, veo que aunque el evento Page_Load se desencadena y se maneja cuando ejecuto la solicitud web, no se ejecuta el controlador para el clic de botón (lo que significa que el evento no se desencadena o se está desencadenando pero no manejado - supongo que es más probable que el primer caso).

Así que mi pregunta es - ¿cómo sabe ASP.NET qué botón se ha hecho clic para que pueda invocar el controlador adecuado?

Pensé que esto se hizo usando el parámetro __EVENTTARGET - Lo he configurado correctamente en el cuerpo del mensaje de la solicitud web, pero esto no hizo diferencia.

Miré el argumento decodificado __VIEWSTATE, pero no pude ver nada obvio allí.

¿Alguien puede proporcionarme más ayuda?

EDIT: Para que quede claro, no estoy preguntar cómo agregar un controlador de clic para una aplicación web.

Más bien, estoy buscando en una aplicación que ya tiene tiene un botón haga clic en controlador de eventos, y quiero saber cómo asp.net se da cuenta de una solicitud web entrante qué botón hacer clic en el código del controlador de eventos para invocar.

+0

¿Puedes dar más detalles sobre cómo estás haciendo la webrequest? ¿Usando código C# o jquery o javascript? ¿Transmite el _Viewstate junto con la solicitud web? ¿Qué error estás viendo? –

+0

Estoy usando C#. Lo que estoy haciendo es que estoy haciendo una solicitud inicial a una página, y obtengo un elemento __VIEWSTATE en la respuesta. Luego, en la solicitud web que genero para imitar la devolución de datos, paso el valor de este __VIEWSTATE. No veo un error; lo único que veo es que cuando pongo un punto de interrupción en el código del servidor es porque no se está llamando al código para manejar el botón clic en el servidor. –

Respuesta

0

OK, así que cuenta de esto al final.

La solicitud debe contener un par de valor de nombre, donde el nombre es el id del botón en el que se hizo clic, y el valor puede ser '1'.

Lo que me desconcertó es que en la solicitud generada al hacer clic en el botón, no vi ese par de nombre de valor. Muy extraño de hecho.

Sin embargo, al agregar este par de valor de nombre a mi solicitud web creada, se activó el código del controlador de eventos del botón.

0

En su código detrás, usted tiene que tener un evento para procesar, y ese evento tiene que tener Handles ButtonName.Click

IE:

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click 
    ''# Process everything you want to process when Button2 gets clicked 
End Sub 

Por otra parte, en su botón se pueden OnClick conjunto en el margen.

<asp:button ID="Button2" runat="server" OnClick="Button2_Click" Text="Click Me" /> 

Debido a que el botón se establece en runat="server", .NET va a hacer todo el trabajo pesado para usted.

+0

Hola, Rockinthesixstring, como le dije a Cylon Cat anterior, no quiero manejar el evento de clic: solo quiero averiguar por qué el evento de clic existente no se activa cuando invoco una solicitud web que es idéntica a la solicitud que se invoca con un clic de botón. Si supiera exactamente qué asp.net estaba buscando en la solicitud web para invocar el código del controlador de clics, entonces agregaría esto a la solicitud web; de ahí mi pregunta original sobre cómo asp.net analiza la solicitud web que es enviado para descubrir qué controlador invocar. –

0

Existen varias maneras sencillas de crear un controlador de eventos para un botón. En el modo de diseño, haga doble clic en el botón. O, también en el modo de diseño, seleccione el botón, abra la ventana Propiedades, haga clic en el ícono del "rayo" y vea una lista de eventos que el control puede activar. Haga doble clic en el evento que desee.

Cuando haga una de estas cosas, Visual Studio, creará el controlador de eventos en su código subyacente y conectará el evento.

El controlador de eventos del botón se ejecuta después de la carga de la página y después de la validación de la página si está utilizando validadores de ASP.NET.

+0

Hola Cylon Cat, ** no ** quiero crear un controlador de eventos para un botón. Más bien, quiero ejercer el código del servidor en una aplicación web que se supone que maneja un clic de botón. Quiero hacer esto invocando una solicitud web que es idéntica a la solicitud web que se genera cuando se hace clic en un botón. Creo que hacerlo debería provocar que se llamara al código del controlador de clic, pero esto no está sucediendo. Así que quiero saber qué busca asp.net en una solicitud web para averiguar qué código de controlador de eventos debe invocarse. –

+0

Las solicitudes web se manejan de manera muy diferente a los clics de botón, por lo que si desea tratar esto como una solicitud web, puede ir de dos maneras. Uno es mediante el uso de métodos de página, y el otro es mediante la creación de un servicio web. No he usado los métodos de página, pero son métodos que se pueden llamar a AJAX dentro de una página, y necesitarás una etiqueta asp: ScriptManager que especifique que vas a usar los métodos de página. Si crea un servicio web, el código de servicio se ejecutará durante la sesión en ASP.NET y tendrá acceso a las variables de la sesión. Puede codificar una referencia de servicio en el asp: ScriptManager; eso hace que el servicio se pueda llamar desde JavaScript –

1

No puedo responder su pregunta, pero puedo decirle cómo averiguarlo.

Agregue una línea a su página_carpeta: Request.SaveAs (@ "c: \ temp \ request.txt", true); (para un ejemplo).

Luego haga clic en su botón para efectuar la devolución de datos.

Luego lea el contenido de request.txt. ¿Hay algo útil o interesante allí?

+0

Gracias, Wozza. Lo intentaré y le contaré lo que descubrí. –

0

Parece que realmente solo se debe publicar el valor __EVENTTARGET con el ID del botón que desea hacer clic. Debe establecer EnableEventValidation = "false" o ASP.NET emitirá un error. Mira este ejemplo. Página html simple, publicaciones en la página asp.net, simulando un botón, haga clic en esa página, que debería ser similar a lo que está tratando de hacer.

página HTML:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<body> 
    <form action="Default.aspx" method="post"> 
    <input value="cmdSubmit" name="__EVENTTARGET" type="hidden" /> 
    <input type="submit" value="submit" /> 
    </form> 
</body> 
</html> 

página ASP.NET con el botón de clic (Default.aspx):

<%@ Page Language="C#" EnableEventValidation="false" %> 
<script runat="server"> 

    protected void cmdSubmit_Click(object sender, EventArgs e) 
    { 
     litResult.Text = "Submit button clicked"; 
    } 
</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<body> 
    <form id="form1" runat="server"> 
    <asp:Literal ID="litResult" runat="server" EnableViewState="false"></asp:Literal> 
    <asp:Button UseSubmitBehavior="false" ID="cmdSubmit" EnableViewState="false" runat="server" 
     OnClick="cmdSubmit_Click" Text="Submit" /> 
    </form> 
</body> 
</html> 
+0

Chris, podría generar el javascript, pero ¿cómo respondería esto a mi pregunta de cómo asp.net sabe cómo desencadenar un código de manejo de eventos en particular? –

+1

Me parece que javascript establece el valor del campo oculto __EVENTARRECTO con el ID del control que se está haciendo clic y luego envía el formulario. Pero probablemente haya algo más que eso, como que tal vez el campo viewstate no puede estar vacío para indicar que se trata de una devolución de datos. –

+0

Ese es un buen punto, Chris, y eso es lo que yo pensaba. Verifiqué el campo __EVENTARLOTE de la solicitud que se generó al hacer clic en el botón, y tenía el id del botón en el que se hizo clic. Luego me aseguré de que mi solicitud tuviera el mismo valor de __EVENTTARGET, pero esto no pareció desencadenar el controlador de evento de clic de botón. Entonces quizás haya algo más. Ojalá alguien pudiera arrojar más luz aquí ... –

5

En primer lugar, un botón de ASP.NET <asp:button> renders como un elemento <input type="submit" runat="server"...> en el formulario. Con referencia a las devoluciones, este botón se comporta de manera diferente en comparación con otros controles.

Al hacer clic en <input type="submit"...> se activará automáticamente una devolución de datos sin la ayuda de ASP.NET (pruébelo en un .htm). Puede determinar en qué botón se hizo clic al ver los parámetros del cuerpo POST. El nombre del botón y su valor (Text prop.) Se enviarán como parámetros. __EVENTTARGET no está en la imagen y debe ser nulo. Además, habrá SOLO UN control de botón en la lista de parámetros según la especificación (la que se hizo clic). Entonces ahora sabes en qué botón se hizo clic.

Entonces, ¿para qué sirve __EVENTTARGET?

Otros controles, como <asp:DropDownList>, que se representan como SELECT, no activan una devolución de datos cuando se hace clic en ellos, sino que simplemente activan un evento onChange javascript. Si desea manejar el evento en el lado del servidor a través del evento SelectedIndexChanged, ASP.NET tendrá que hacer un trabajo extra para usted. Si configura AutoPostBack = True para DropDownList, ASP.NET capturará el evento onChange JS original y conectará una función __doPostBack JS personalizada que es responsable de rellenar __EVENTTARGET y explicitamente enviando el formulario. Ahora puede determinar el control que desencadenó la devolución de datos examinando __EVENTTARGET.

Espero que esto ayude un poco!

Cuestiones relacionadas