[ASP.NET] Actualización 2012

Así es, se anunció una serie de actualizaciones para ASP.NET – Visual Studio y ya es posible descargarlas y trabajarlas.

Descarga

La descarga la podemos realizar directamente en la WEB de ASP.NET en este enlace

¿Que se incluye?

En esta actualización lo primero que podemos notar es una serie de nuevas plantillas sobre nuestro Visual Studio 2012.

Entre la serie de mejoras podemos ubicar:

  • Facebook Template
  • Web Api Tracing, especial para el debug en nuestras apis
  • Soporte para OData wn Web Api
  • Windows Azure Authentication
  • Simple Page Aplication

Una última, que merece una felicitación para sus creadores Damian Eduards y David Fowler… si estoy hablando de SignalR 😀

Ya para terminar recomiendo este artículo del buen Jon Galloway.

Espero estén tan emocionados como yo 😛

Hasta el próximo post.

[ASP.NET] Actualización 2012

[ASP.NET] Obtener todos los controles de la pagina con Master Page

Hola, ya hace tiempo escribí un post de un caso particular, en el que recuperabamos los controles de una pagina y trabajamos con ellos fácilmente gracias a Linq [puedes ver la entrada aquí].

Un escenario similar del que no hable, pero se presenta mucho (y del que se ven muchas preguntas en los foros) es como obtener los controles de una pagina cuando esta se encuentra dentro de una Master Page, bueno pues hoy hablaremos de esto.

Lo primero que hay que tener en cuenta es que la pagina donde agregamos los controles queda ubicada dentro de un ContentPlaceHolder, es por esto, que cuando intentamos hacer algo como esto:

Page.Form.Controls.OfType();

la colección vendrá vacía porque los controles no se ubican como tal en esta, se ubican en el elemento contenedor definido en la master page, es algo similar como cuando se quiere localizar un elemento con JavaScript por el ID que le dejamos, a la hora de renderizarse este habrá cambiado.

Bueno, la solución para este problema…. simple, debemos obtener el ContentPlaceHolder y trabajar sobre este, así:

ContentPlaceHolder content = (ContentPlaceHolder)Master.FindControl("MainContent");
IEnumerable allDropDownList = content.Controls.OfType();

Espero les sea de utilidad.

Hasta el próximo post.

[ASP.NET] Obtener todos los controles de la pagina con Master Page

[SQL Server 2008][ASP.NET] Extraño caso con Session.LCID

Ayer en la tarde me disponía a presentar un proyecto web, que como siempre de forma local me funcionaba perfecto (como a todos nosotros) pero no se me ocurrió pasarlo por mi IIS antes de montarlo en el servidor de aplicativo, así que me fui muy confiado a la presentación y cuando en un momento quisieron trabajar con porcentajes la transacción me retornaba un error bastante raro: SqlException (0×80131904): Line 28: Incorrect syntax near ‘,’ Apenas vi el error en pantalla lo supe! tenía que ver con la Cultura del servidor, pero nunca había visto algo así, además el error era de SQL, entonces me retire de la reunión y empecé a correr los querys uno a uno.

Una vez revisé los querys y ninguno me arrojaba este error, acudí al administrador de infraestructura para preguntarle por las configuraciones regionales de los servidores, el de aplicativo y el de base de datos. El hombre me dijo que el de BD esta en español y el de aplicativo en Ingles Americano. ¡Ohh! ¿Cómo así? ¿Quién aprobó esto? Ahí estaba el problema, cuando se pedían porcentajes se retornaban valores decimales si el porcentaje era mayor a cero e inferior a cien. Este tipo de configuraciones regionales y de idioma afectan de manera global el uso de puntos y comas para miles y decimales, pero el cambiarlo desde el panel de control no afectaría al IIS ni al SQL Server, (¿por qué? no lo sé) así que era hora de cambiar el Session.LCID que en resumidas cuentas es una propiedad de tipo entero que define el culture Info del aplicativo, pero, ¿cuál usar en este caso? Empecé a Bingdear y a Googlear hasta que di con el que necesitaba, les dejo una tablita con los resultados de varios ID’s que encontré y creí me servirían:

Session.LCID = 2057 Inglaterra
Session.LCID = 1033 USA
Session.LCID = 2058 México (comas y punto)
Session.LCID = 1033 USA
Session.LCID = 11274 Argentina (puntos y comas)

Redefiní mi Session.LCID en el aplicativo con el ID de México compile, subí y funcionó.

Espero les sea útil esta experiencia y la solución que le día a la misma.

Hasta el próximo post.

[SQL Server 2008][ASP.NET] Extraño caso con Session.LCID

[Linq] Obtener los Radiobuttons a partir de su GroupName

Hoy en la mañana cuando llegue a la oficina y empecé a revisar los foros, me encontré con una pregunta curiosa (“Obtener todos los Radiobuttons a partir del GroupName“)… entonces pensé, – este hombre necesita saber el poder de Linq, así que le respondí de la siguiente forma.

En un escenario como el siguiente, una página web con seis Radiobuttons, separados en dos grupos de tres (“Grupo1” y “Grupo2”) y un botón que desencadena la acción.

Teniendo claro esto, manos al teclado Lo primero para poder trabajar con Linq (en este caso) es tener una colección IEnumerable del tipo RadioButton que contendrá todos los controles de este tipo, así:

IEnumerable<RadioButton> allRadios = Page.Form.Controls.OfType<RadioButton>();

Como vemos en la anterior línea de código accedemos a los controles del Form de la página y acudimos al método extensor OfType siendo T la clase por la que debemos “filtrar”. Como el extensor OfType retorna un IEnumarable (no un ControlCollection) ya tenemos acceso a todo el poder de Linq.

Ahora nos queda filtrar por el nombre de grupo, para esto he creado una función llamada getByGroupName, así:

private IEnumerable<RadioButton> getByGroupName(IEnumerable<RadioButton> allRadios, string groupName)
{
        return from radios in allRadios
               where radios.GroupName == groupName
               select radios;
}

De esta forma, haciendo uso de Linq dejamos de usar iteradores y hardcode pues le agregamos un tanto más de dinamismo a este tipo de trabajos.

Pero bueno ¿y si ahora queremos saber cuáles de este grupo están seleccionados o no? Fácil, la respuesta es Linq. Para esto creamos otro método al que llamaremos getAllCheckeds, así:

private IEnumerable<RadioButton> getAllCheckeds(IEnumerable<RadioButton> byGroupname, bool check)
 {
         return from radios in byGroupname
                where radios.Checked == check
                select radios;
 }

De esta forma podemos obtener toda la información que queramos de nuestros controles, haciendo uso de Linq. Finalmente, para el que se le dificulte el entendimiento del código, aquí lo dejo todo (más abajo el link de descarga):

protected void Button1_Click(object sender, EventArgs e)
{
        IEnumerable<RadioButton> allRadios = Page.Form.Controls.OfType<RadioButton>();
        IEnumerable<RadioButton> byGroupname = getByGroupName(allRadios, “Grupo1″);
        IEnumerable<RadioButton> radioCheked = getAllCheckeds(byGroupname, true);      
}

private IEnumerable<RadioButton> getByGroupName(IEnumerable<RadioButton> allRadios, string groupName)
{
        return from radios in allRadios
               where radios.GroupName == groupName
               select radios;
}
private IEnumerable<RadioButton> getAllCheckeds(IEnumerable<RadioButton> byGroupname, bool check)
{
        return from radios in byGroupname
               where radios.Checked == check
               select radios;
}

Descarga el ejemplo.

Espero les sea de utilidad.

Hasta el próximo post.

[Linq] Obtener los Radiobuttons a partir de su GroupName

[ASP.NET] Pasar información entre páginas con propiedades

No hace mucho escribí acerca de cómo pasar información de un Winform hijo a uno padre, en ese artículo describí las ventajas de usar interfaces, pues desacoplaban la comunicación de los Forms. Bien, pues esta misma técnica es posible aplicarla en el entorno cliente – servidor, y nos permite el pasaje e información entre Web Forms de forma segura y limpia.

Para este ejemplo, en un sitio de ASP.NET he agregado dos WebForms (Default1 y Default2), en Default1 he agregado un botón y un TextBox. En Default2.aspx agregué un Label que me servirá para mostrar el resultado al usuario.

Al botón le he definido en su propiedad PostBackUrl el nombre del WebForm al que quiero redirigir (Default2.aspx).

Al proyecto le agregamos la interfaz Iwebforms.cs con un miembro string llamado valor, así:

public interface Iwebforms
{
    string valor { get; set; }
} 

Esta interfaz será implementada en el WebForm desde el que quiero enviar la información(Default1.aspx), así:

public partial class _Default : System.Web.UI.Page, Iwebforms
{
    public string valor { get; set; }
} 

Ahora en el evento del botón “Enviar-Info” le asignamos un valor a nuestra propiedad, en este caso le asignaré el valor del TextBox, así:

valor = txt_Info.Text;

Y finalmente nos queda poder recuperar el valor del miembro desde el WebForm (Default2.aspx) en su evento Load, así:

Iwebforms inter = PreviousPage as Iwebforms;
if(inter != null)
          Label1.Text = inter.valor;

Como podemos ver, en este ultimo bloque de código  hacemos uso del PreviousPage (implementado desde ASP.NET 2.0)  esta clase nos permite acceder a miembros de la clase de la pagina anterior.

Descarga el ejemplo

Espero les sea útil.

Hasta el próximo post.

[ASP.NET] Pasar información entre páginas con propiedades

[How to] Agregar controles dinamicamente

En este post explicar cómo crear un control dinámicamente y agregarle un evento.

Para empezar, vale aclarar que, un control es una clase, es decir, podemos heredar e instanciar a partir de estas, teniendo claro esto, lo primero que haremos será crear una nueva instancia de la clase Button, así:

Button bt = new Button();

Una vez tenemos nuestro objeto en “blanco” es hora de definir sus propiedades, como su ID y el texto que contendrá, así:

bt.ID = "miBoton";
bt.Text = "Boton agregado en Runtime"; 

Ahora que nuestro objeto tiene un nombre y una apariencia, es hora de “pintarlo” en nuestro WebForm, esto lo hacemos así:

this.Page.Form.Controls.Add(bt);

Si ejecutamos ahora veremos que se crea el botón en pantalla, pero no hace nada, para que nuestro control haga algo es necesario crear un evento, así:

protected void bt_Clic(object sender, EventArgs e)
{
         Response.Write(@”<script language=’javascript’>alert(‘Funciona’);</script>”);
} 

Este evento escribirá un alert de lado del cliente cundo se haga click sobre el botón, pero ¿Cómo se le asigna este evento al control?, así:

bt.Click += new EventHandler(bt_Clic);

Esta es la forma en la que se agrega un evento de forma dinámica a una pagina aspx.

Espero les sea de utilidad.

Hasta el próximo post.

[How to] Agregar controles dinamicamente

[How to] Encontrar un control de la masterpage

En ocasiones cuando se trabaja con MasterPage necesitamos acceder a los controles contenidos en esta para modificar alguna de sus propiedades.

Para esto es necesario crear un objeto del tipo del control que necesitamos obtener y acceder a su “ruta” así:

TipoControl micontrol = (TipoControl)this.Master.FindControl(“IdContorl”);

Como se puede ver no es nada difícil, simplemente se accede a la ruta completa del control apuntando a la MasterPage que contiene la página actual y luego con el método FindControl buscamos por el ID del mismo.

Ejemplo práctico:

En una página con un MasterPage definido, agrega un control Label, y desde una página hija en el evento que quieras copia lo siguiente:

Label milabel = (Label)this.Master.FindControl(“label1″);
milabel.Text = “NUEVO TEXTO”;   

Hasta el próximo post.

[How to] Encontrar un control de la masterpage