El espacio a solo unos clics

Bueno ya comentame Miguel Llopis de que microsoft saco un nuevo producto. WorldWide Telescope es realmente un producto interesante, primero por su aplicabilidad y segundo que estimo que esta echo en WPF, Ya ven de lo que se puede hacer con esta tecnologia, y de por si que es facinante. Una imagnes para el deleite.

Espacio

Algo interesante son los refresh de nuestros acercamientos, son muy buenos, Realmente se lucieron con este producto.

Espacio1

S@ludos.

Romny

Tips para trabajar con los proveedores de datos de ASP.NET

Me hicieron un consulta de como integrar los proveedores de datos de asp.net con nuestra aplicacion; Aqui voy a dar unos pequeños tips de como hacer eso.

Lo primero que debemos hacer es entender un poco el funcionamiento de los mismo y si comenzamos con el tema, la mejor forma para estudiar es estudiar el codigo de aplicaciones ya existentes que no nos ofrece asp.net con los Starter Kit, estos nos ofrecen una clara forma de como integrarlos con nuestra aplicacion.

Hay que tener algo bien claro y es que cuando ejecutamos la herramienta de administracion esta nos crea una base de datos nueva, y bueno la verdad no queremos esto ya que los usuarios no se almacenaran en nuestra BD con la que vamos a trabajar.

rol1

En este post nos muestra como agregar las nuevas tablas en nuestra bd.

Pero como hacemos para que cuando ejecutemos la herramienta de administracion no nos cree la nueva base de datos. En el web.config agregamos las siguientes lineas de codigo.

   1: <membership defaultProvider="AspNetSqlMembershipProvider">
   2: <providers>
   3: <clear/>
   4: <add name="AspNetSqlMembershipProvider" connectionStringName="SCRUMRConnStr" applicationName="SCRUM" 
   5: type="System.Web.Security.SqlMembershipProvider, System.Web, &#xA;Version=2.0.0.0, Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
   6: </providers>
   7: </membership>
   8: <roleManager enabled="true">
   9: <providers>
  10: <remove name="AspNetSqlRoleProvider"/>
  11: <add connectionStringName="SCRUMRConnStr" applicationName="SCRUM" name="AspNetSqlRoleProvider" 
  12: type="System.Web.Security.SqlRoleProvider, &#xA;System.Web, Version=2.0.0.0, Culture=neutral, &#xA;PublicKeyToken=b03f5f7f11d50a3a"/>
  13: </providers>
  14: </roleManager>

En los Starter Kit podran ver por ejemplo como trabajar tablas con nuestros usuarios.

Dejo algunos link de interes de este tipo

http://geeks.ms/blogs/sergiotarrillo/archive/2007/12/13/56926.aspx

http://geeks.ms/blogs/fjcarbajosa/archive/2007/02/22/membres-a-de-asp-net-2-0-i.aspx

http://geeks.ms/blogs/eecsaky/archive/2006/10/01/Personalizando-las-aplicaciones-Web-_2800_III_2900_.aspx

http://geeks.ms/blogs/mrubino/archive/2008/01/27/custom-membershipprovider-y-roleprovider.aspx

Espero que los oriente un poco mas con este tema.

S@ludos

Romny

Pruebas de stress y de carga son para hacerlas en el server

Por sugerencia de Sergio estube revisando la serie de cazando mitos y bueno incursione en el mundo de pruebas de stress y de carga y bueno quise probar esto con una aplicacion, realmente me sorprendio este tema y lo exelente que es para mostrar resultados, cabe resaltar que hice la prueba contra mi maquina de desarrollo, no es muy potente pero hace lo necesario.

Los resultados que arrojo la prueba fue que el problema es mi maquina, la aplicacion como tal paso la prueba. Realmente si quieren hacer pruebas hagalas cotra un servidor hacia sea el de test o produccion.

El grafico realmente preocupa.

test

S@aludos.

Romny

Arreglando Intellisence de VS

H@la. Tuve un problemita con mi VS despues de hacer unos cambios en el y por tal motivo en las paginas de codigo por ejemplo Default.asp.cs el intellisence no se comportaba como deberia de ser.

Primero no se desplegaba con solo digitar palabras.

Segundo; tocaba dar Ctr + space para que mostrara dicho intellisence.

La solucion salomica para este problemita fue con la opcio de Importar y Exporta configuraciones.

Importar

Podemos guardar la configuracion actual, o simplemente restablecer la configuracion. En mi caso no queria guardar la configuracion.

Importar1

Escogemos que tipo de confiuracion queremos.

Importar2

Y voala todo bien.

Importar3

S@ludos.

Romny

[AutoCompleteExtender] Mejora la UI en nuestra App

H@la.

Quisiera hablar del componente AutoCompleteExtender del Control Tool Kit para Asp.Net Ajax.

Este componente ayuda mucho a la UI, para no sobrecargar la interfaz y hacerla mas agradable para el cliente, Imaginense el siguiente ecenario, tienen una tabla donde se almacenan codigos, los cuales tienes que enlazarlo con un control para que el usuario pueda ver y escojer dicho codigo. No parece nada del otro mundo, pero que pasa si la descripcion del cosigo es excesavamente larga y cuando lo enlazas al control Upsss, desborda el formulario y ya realmente la UI no se ve muy bien.

Pues bien lo que podriamos hacer es usar AutoCompleteExtender y bien enlazarlo con el codigo o con la descripcion, realmente como desees.

Primero miremos como quedaria el web service para que a medida que yo digite aparesca las concordancias de la BD con ese campo. El metodo quedaria haci.

   1: public string[] GetCie(string prefixText, int count)
   2:    {
   3:        List<string> items = new List<string>(count);
   4:        DataSet ds = new DataSet();
   5:  
   6:        string connectionString = "Data Source=(local);Initial Catalog=XXXX;Integrated Security=SSPI;";
   7:        using (SqlConnection connection = new SqlConnection(connectionString))
   8:        {
   9:            string sql = "SELECT CIE_Codigo FROM Tb_CIE10 WHERE CIE_Codigo LIKE '" + prefixText + "%'";
  10:            SqlDataAdapter adapter = new SqlDataAdapter();
  11:            adapter.SelectCommand = new SqlCommand(sql, connection);
  12:            adapter.Fill(ds);
  13:        }
  14:  
  15:        foreach (DataRow dr in ds.Tables[0].Rows)
  16:        {
  17:            items.Add(dr["CIE_Codigo"].ToString());
  18:        }
  19:  
  20:        return items.ToArray();
  21:    }

no olviden colocar esto al comenzar el web service,

   1: [System.Web.Script.Services.ScriptService]

Segidamente en el control de AutoCompleteExtender colocomos el metodo  que usara y le hacignamos el control al cual le voy ah pasar la funcionalidad de ajax.

AutoCompleteExtender

Basicamente de este modo nos podemos quitar varios dolores de cabeza, tratando de cuadrar la UI.

S@ludos.

Romny

Clínica para el Examen de Certificació n 70-536 {REANUDACIÓN}

 H@la a todos.


Bueno revisando la lista de los link que visito, Retome la idea de la clinica de de certificacion 70-536 que la gente de devworx tiene; Y bueno ya hacia tiempo que no actualizaban los contenidos, pero hoy a vuelta de correo confirmaron los nuevos temas y bueno, aqui dejo la lista de temas que actualizarón.



S@ludos.


Romny

[RTRIM] Una función que ayuda bastante.

H@la.

Bueno esta haciendo un proceso de migración de datos y me encontre con un ligero problema o inconveniente.

Resulta que cundo hay campos char y importas datos desde una fuente externa, en este caso Excelito. Cuando se hacia la importacion este rellenaba con espacion en blanco hasta completar el tamaño del campo. Este a demas que trae problemas con la interfas ya que el formulario se desborda por lo espcacios en blanco y bueno ciestos de registros que tiene la tabla, viene la pregunta que hacer.

Una opción seria cambiar el tipo de datos y volver a importar.

Otra es buscar en los libros de ayuda de Sql Server, y bueno me decidi por esta opcion y encontre la funcion RTRIM y LTRIM. Y lo que hice fue basicamente acutualizar ese campo.

   1: -- ================================================
   2: -- TSQL para actualizar campo con RTRIM
   3: -- ================================================
   4:  
   5: update Tb_CIE10 set CIE_Descripcion = RTRIM(CIE_Descripcion)

 

Bueno, Problema resuelto. Pero igual me quedo la duda y probe con ingresar los registros con SQL y persistio el problema. Con tipo varchar no hay problema, pero con char si hay el inconveniente. Gracioso no!.

S@ludos.

Romny

ASP.NET Portal Starter Kit v2.0

Hola otra vez por estos lados.

Bueno revisando los nuevos proyectos de Codeplex, me encotre con un proyecto que alegrara a muchos, ya que cuando estabamos comenzando con asp.net 1.0 y 1.1 esta este tamplate de ASP.NET Portal y bueno parece que le hicieron el proceso mas preciedo por algunos desarrolladores que es, el proceso de reingenieria y sacaron la version ASP.NET Portal Starter Kit v2.0 de este template.

Portal_Big

Coloco algunos feautures que trae esta version.

  • Dynamic Portal Infrastructure
  • 10 basic portal modules for common types of content
  • 2 extra portal modules: RSS Feed and Wiki new.jpg
  • A «pluggable» framework that is simple to extend with custom portal modules
  • Online administration of portal layout, content and security
  • XML based definition of portal layout
  • Database based definition of portal layout new.jpg
  • Roles-based security for viewing content, editing content, and administering the portal
  • Full mobile support using the ASP.NET Mobile Controls
  • Multiple database support easily extensible to support more databases new.jpg
  • Web service layer ASMX and WCF new.jpg
  • Smart Client to support Admins and power users new.jpg

Tecnologias que usa.

  • .NET 2.0 .NET 3.5 new.jpg
  • Web Client Software Factory new.jpg
  • Object Builder new.jpg
  • Smart Client Software Factory new.jpg
  • ASP.NET Mobile Controls
  • Three-tier architecture with ASP.NET
  • Role Based Security
  • Layered architecture new.jpg
    • Vertical: DataBusinessPresentation
    • Horizontal: Services, Framework
  • Design Patterns new.jpg
  • NUnit Tests new.jpg
  • Master Pages, SiteMaps & Themes new.jpg

Por encima se ve que usa lo nuevo, pero se me hace raro que no use AJAX.

Hablamos.

Romny

Manejando Usuarios Parte II

Hola que tal, bueno siguiendo con el tema de los proveedores de asp.net quisiera mostrar como hacer para actualizar roles al determinado usuario.

Vamos a crear en una nuevo pagina, el siguiente aspecto.

rol3

Basicamente lo que vamos a hacer es que dependiendo del usuario que seleccione en este formulario me carge algunos datos basicos de dicho usuario y ademas poder asignarle un rol si este no tiene un rol.

Este es el codigo que utilize para manejar esta parte.

   1: string userName = "";
   2:  
   3:     protected void Page_Load(object sender, EventArgs e)
   4:     {
   5:         // retener el username con un querystring
   6:         userName = this.Request.QueryString["UserName"];
   7:               
   8:  
   9:         if (!this.IsPostBack)
  10:         {
  11:             // mostrar los detalles del usuario
  12:             MembershipUser user = Membership.GetUser(userName);
  13:             lblUserName.Text = user.UserName;
  14:             lnkEmail.Text = user.Email;
  15:             lnkEmail.NavigateUrl = "mailto:" + user.Email;
  16:             lblRegistered.Text = user.CreationDate.ToString("f");
  17:             lblLastLogin.Text = user.LastLoginDate.ToString("f");
  18:             lblLastActivity.Text = user.LastActivityDate.ToString("f");
  19:             chkOnlineNow.Checked = user.IsOnline;
  20:             chkApproved.Checked = user.IsApproved;
  21:             chkLockedOut.Checked = user.IsLockedOut;
  22:             chkLockedOut.Enabled = user.IsLockedOut;
  23:  
  24:             BindRoles();
  25:         }
  26:     }
  27:  
  28:     private void BindRoles()
  29:     {
  30:         // Llenar el CheckBoxList con todas las funciones disponibles y, a continuación, seleccione 
  31:          // A los que pertenece el usuario
  32:         chklRoles.DataSource = Roles.GetAllRoles();
  33:         chklRoles.DataBind();
  34:         foreach (string role in Roles.GetRolesForUser(userName))
  35:             chklRoles.Items.FindByText(role).Selected = true;
  36:     }
  37:  
  38:     protected void btnCreateRole_Click(object sender, EventArgs e)
  39:     {
  40:         if (!Roles.RoleExists(txtNewRole.Text.Trim()))
  41:         {
  42:             Roles.CreateRole(txtNewRole.Text.Trim());
  43:             BindRoles();
  44:         }
  45:     }
  46:  
  47:     protected void btnUpdateRoles_Click(object sender, EventArgs e)
  48:     {
  49:         // actualizar las funciones con el usuario
  50:         string[] currRoles = Roles.GetRolesForUser(userName);
  51:         if (currRoles.Length > 0)
  52:             Roles.RemoveUserFromRoles(userName, currRoles);
  53:         
  54:         List<string> newRoles = new List<string>();
  55:         foreach (ListItem item in chklRoles.Items)
  56:         {
  57:             if (item.Selected)
  58:                 newRoles.Add(item.Text);
  59:         }
  60:         Roles.AddUserToRoles(userName, newRoles.ToArray());
  61:  
  62:         lblRolesFeedbackOK.Visible = true;
  63:     }
  64:  
  65:     protected void chkApproved_CheckedChanged(object sender, EventArgs e)
  66:     {
  67:         MembershipUser user = Membership.GetUser(userName);
  68:         user.IsApproved = chkApproved.Checked;
  69:         Membership.UpdateUser(user);
  70:     }
  71:  
  72:     protected void chkLockedOut_CheckedChanged(object sender, EventArgs e)
  73:     {
  74:         if (!chkLockedOut.Checked)
  75:         {
  76:             MembershipUser user = Membership.GetUser(userName);
  77:             user.UnlockUser();
  78:             chkLockedOut.Enabled = false;
  79:         }
  80:     }

Y una pequena imagen para mostrar el funcionamiento.

rol4

Codigo

Saludos

Romny

Manejando Usuarios con los proveedores de asp.net en mi app

Hola gente de Geeks.


Si te gusta trabajar con los proveedores de datos de asp.net como a mi, sabras que la administracion de usuarios se maneja a travez de un sitio independiente. Pero que pasaria si pudieras integrar esto en tu aplicacion, pues te ahorraria tiempo y muchos dolores de cabeza.


En este post voy a indicar como identificar los usuarios de mi app. en los proximos post en como hacer un poco de adminstracion de estos mismos.


Primero lo primero, en estos post hacen referencia a los proveedores que maneja asp.net. Link 1, Link 2, Link 3.


Bueno, despues de crear usuarios y roles con la herramienta que trae VS y de comprobar la bd que se crea.


rol1


Primero vamos a mostrar cuantos usuarios hay y cuantos estan en linea, Ademas voy a cargar en un repetear las letras del alfabeto para buscar los usuarios.


 



   1: private MembershipUserCollection allUsers = Membership.GetAllUsers();
   2: protected void Page_Load(object sender, EventArgs e)
   3: {
   4:     if (!this.IsPostBack)
   5:     {
   6:         lblTotUsers.Text = allUsers.Count.ToString();
   7:         lblOnlineUsers.Text = Membership.GetNumberOfUsersOnline().ToString();
   8:  
   9:         string[] alphabet = «A;B;C;D;E;F;G;J;K;L;M;N;O;P;Q;R;S;T;U;V;W;X;Y;Z;All».Split(‘;’);
  10:         rptAlphabet.DataSource = alphabet;
  11:         rptAlphabet.DataBind();
  12:     }
  13:  
  14: }

Luego voy a hacer una busqueda tanto por username como por mail.



   1: protected void btnSearch_Click(object sender, EventArgs e)
   2:     {
   3:         bool searchByEmail = (ddlSearchTypes.SelectedValue == «E-mail»);
   4:         gvwUsers.Attributes.Add(«SearchText», «%» + txtSearchText.Text + «%»);
   5:         gvwUsers.Attributes.Add(«SearchByEmail», searchByEmail.ToString());
   6:         BindUsers(false);
   7:     }

Ademas manejo unos eventos tanto del repeater como del gridview donde se cargan los datos.



   1: private void BindUsers(bool reloadAllUsers)
   2:     {
   3:         if (reloadAllUsers)
   4:             allUsers = Membership.GetAllUsers();
   5:  
   6:         MembershipUserCollection users = null;
   7:  
   8:         string searchText = «»;
   9:         if (!string.IsNullOrEmpty(gvwUsers.Attributes[«SearchText»]))
  10:             searchText = gvwUsers.Attributes[«SearchText»];
  11:  
  12:         bool searchByEmail = false;
  13:         if (!string.IsNullOrEmpty(gvwUsers.Attributes[«SearchByEmail»]))
  14:             searchByEmail = bool.Parse(gvwUsers.Attributes[«SearchByEmail»]);
  15:  
  16:         if (searchText.Length > 0)
  17:         {
  18:             if (searchByEmail)
  19:                 users = Membership.FindUsersByEmail(searchText);
  20:             else
  21:                 users = Membership.FindUsersByName(searchText);
  22:         }
  23:         else
  24:         {
  25:             users = allUsers;
  26:         }
  27:  
  28:         gvwUsers.DataSource = users;
  29:         gvwUsers.DataBind();
  30:     }
  31:  
  32:     protected void rptAlphabet_ItemCommand(object source, RepeaterCommandEventArgs e)
  33:     {
  34:         gvwUsers.Attributes.Add(«SearchByEmail», false.ToString());
  35:         if (e.CommandArgument.ToString().Length == 1)
  36:         {
  37:             gvwUsers.Attributes.Add(«SearchText», e.CommandArgument.ToString() + «%»);
  38:             BindUsers(false);
  39:         }
  40:         else
  41:         {
  42:             gvwUsers.Attributes.Add(«SearchText», «»);
  43:             BindUsers(false);
  44:         }
  45:  
  46:     }
  47:  
  48:     protected void gvwUsers_RowCreated(object sender, GridViewRowEventArgs e)
  49:     {
  50:         
  51:         if (e.Row.RowType == DataControlRowType.DataRow)
  52:         {
  53:             ImageButton btn = e.Row.Cells[6].Controls[0] as ImageButton;
  54:             btn.OnClientClick = «if (confirm(‘Esta seguro de eliminar esta cuenta?’) == false) return false;»;
  55:         }
  56:     }
  57:  
  58:     protected void gvwUsers_RowDeleting(object sender, GridViewDeleteEventArgs e)
  59:     {
  60:         
  61:         string userName = gvwUsers.DataKeys[e.RowIndex].Value.ToString();
  62:         ProfileManager.DeleteProfile(userName);
  63:         Membership.DeleteUser(userName);
  64:         BindUsers(true);
  65:         lblTotUsers.Text = allUsers.Count.ToString();
  66:     }

rol2


En los proximos articulos mostrare como actualizar informacion de los usuarios y roles. De esta forma no podremos depender de la administracion web que viene en VS. Por cierto el css que use fue el de Whidbey Rocks.


Codigo


Espero les guste mi pequeño aporte.


Saludos.


Romny