Como hacer un response en ASP sin enviar toda la página.

Esto es especialmente útil en ajax, si queremos enviar y devolver rapidamente una variable al servidor y que la respuesta no nos envíe mas que un pequeño valor y no todo el código y cabeceras de la página.

Lo normal es que si haces simplemente un Response.Write(“Todo OK!”), si haces un alert con lo que te devuelve, verás que tienes todo el código de la página detrás del Todo OK. Si solo quieres que llegue el Todo OK, sin el resto del código tienes que enviar el mensaje inmediatamente (Flush) y despues completar la conexión y eliminar el contenido.

 

HttpContext.Current.Response.Write(cadena)
HttpContext.Current.Response.Flush()
HttpContext.Current.ApplicationInstance.CompleteRequest()
HttpContext.Current.Response.SuppressContent = True

 

Alternar estilos css sin repetir el código en AlternateItemTemplate

Podemos reducir este código, en el que tendríamos que duplicar los elementos en el Item y en el AlternateItem:


                <ItemTemplate>
                    <div class="impar">
                        <asp:Label ID="lblNombrePase" Text="Pase:" runat="server" />
                        <asp:Label Text="" runat="server" />
                        <asp:Label ID="lblFecha" Text="Fecha:" runat="server" />
                        <asp:Label Text="" runat="server" />
                    </div>
                </ItemTemplate>
                <AlternateItemTemplate>
                    <div class="impar">
                        <asp:Label ID="lblNombrePase" Text="Pase:" runat="server" />
                        <asp:Label Text="" runat="server" />
                        <asp:Label ID="lblFecha" Text="Fecha:" runat="server" />
                        <asp:Label Text="" runat="server" />
                    </div>
                </AlternateItemTemplate>

Y lo podemos dejar así, creando la clase dinamicamente en función del indice del elemento. Y creando solo una vez el lenguaje de marcado.


                <ItemTemplate>
                    <div class="%#(IIf((Container.DataItemIndex Mod 2) = 1, "impar", "par")) %>">
                        <asp:Label ID="lblNombrePase" Text="Pase:" runat="server" />
                        <asp:Label Text="" runat="server" />
                        <asp:Label ID="lblFecha" Text="Fecha:" runat="server" />
                        <asp:Label Text="" runat="server" />
                    </div>
                </ItemTemplate>
              

Esto es válido para todos los controles repetidores de este tipo.

Mandar a descargar un fichero vía ASP.NET

Este es un fragmento de código para decirle al servidor, que descargue un fichero llamado “Descargale.jpg” desde el servidor, y que lo haga con el nombre de “Descargado.jpg”

Dim file As System.IO.FileInfo 
fila= New System.IO.FileInfo("C:\MiCarpeta\descargable.jpg")
Response.AddHeader("Content-Disposition", "attachment;filename=descargado.jpg")
Response.AddHeader("Content-Length", file.Length.ToString())
Response.ContentType = file.Extension.ToLower()
Response.WriteFile(file.FullName)
Response.End()

Evitar validación de formulario al pulsar ENTER

Otra situación incómoda que puede producirse, es que cuando estemos en una caja de texto en un formulario, al pulsar ENTER, automaticamente se active el submit y se reenvíe el formulario. Es un destrozo por ejemplo si estamos trabajando en un textbox multilínea.

Para evitar esto, el formulario tiene un botón por defecto asociado, que es el que se activa cuando cualquier control ejecuta una validación. Si no se asocia ninguno, por defecto realiza un submit. Debemos indicarle por tanto un botón dentro del formulario, al que redirigir estas acciones. Pero como dicho botón no debe hacer nada, debe ser invisible y no tener eventos asociados.

 

<form id="form1" runat="server" defaultbutton="NoHagasNada">
...
...

<asp:Button ID="NoHagasNada" runat="server" Enabled="false" Style="display: none;" />