Me encuentro ahora mismo desarrollando un sitio web en ASP.NET para una asignatura de la universidad y esta tarde me he encontrado con que necesito tener accesibles algunos datos en cualquiera de las páginas que componen el sitio web, así que voy a dejar aquí las dos formas de hacer esto que he encontrado.
Para poneros en situación os diré que mi sitio web está compuesto por una MasterPage, varias páginas de contenido asociadas a la MasterPage y dos páginas más que no están asociadas; la MasterPage tiene un control de LoginName del cual quiero obtener el nombre del usuario que está logueado en cada momento en cualquier página.
Aclaración: podemos obtener el nombre de usuario logueado en el site mediante «this.User.Identity.Name», que sería mucho más correcto para obtener el nombre del usuario en cualquier momento. Sin embargo la idea es ejemplificar como llevar un dato de una parte a otra del site en situaciones en las que no dispongamos del tipo de facilidades como la que tenemos en el caso concreto que he utilizado de ejemplo en el post.
En el Web.config
Para hacer esto he visto varias maneras, la primera de todas se trata de guardar los datos en el Web.config en la zona de «appSettings», esto lo haría de la siguiente forma:
Primero añadiendo una clave a la zona de appSettings en el Web.config
<appSettings>
<add key=»username» value=»valor» />
</appSettings>
Y luego en el código de la página en la que lo necesitemos podemos obtener o modificar el valor de la clave mediante:
System.Configuration.ConfigurationSettings.AppSettings[«username»]
En el Global.asax
Otra manera que he visto es utilizando el archivo Global.asax. Este archivo opcional en los desarrollos de ASP.NET nos permite manejar eventos que ocurren a nivel de la aplicación y de sesión, también nos permite declarar valores que necesitemos entre las diferentes solicitudes.
El archivo Global.asax para que funcione tiene que permanecer en la raíz de la aplicación y solo se admite uno por aplicación ejecutada. Si tenemos algún otro archivo de este tipo en algún subdirectorio no se tendrán en cuenta por la aplicación.
Cuando declaremos una variable dentro de Global.asax estará disponible en todas las páginas de la aplicación. Lo podemos hacer de la siguiente manera:
En el fichero Global.asax declaramos una variable string y luego en Session_Start otorgamos el valor de la cadena a un objeto de tipo Session que en mi caso se llama valorCadena.
public class Global : System.Web.HttpApplication
{
string cadena=»valor inicial»;
protected void Application_Start(object sender, EventArgs e) { }
protected void Session_Start(object sender, EventArgs e)
{
Session[«valorCadena»] = cadena;
}
…
……
Luego en la página que lo necesitemos podemos escribir valores:
Session[«valorCadena»] = «la_cadena_que_quiera_poner»;
y leer de la variable:
Label1.Text = (string)Session[«valorCadena»];
Aporte: Jorge Dieguez nos hace un comentario interesante: «..te recomiendo que en lugar de una(o varias) varaibles sueltas uses una clase que te centralize el acceso a la infromacion de contexto(usuario,su perfil, o lo que sea), esta clase es la responable de almacenear el estado en algun lugar(por ejemplo en la sesion) la idea es que la aplicacion no sepa como y donde se guarda la informacion de contexto..». Quizás es la solución más elegante de todas las planteadas.
Pues nada, si hay alguna corrección o manera más de hacer esto ponedlo en los comentarios y así vamos completando entre todos el post
P.D.: Si queréis más información sobre Global.asax podéis leer algo más aquí
Saludetes 🙂
para el caso de saber el nombre del usuario logueado puedes usar la propiedad user que viene por default en todas las pagina, ahi tienes acceso a la propiedad identity y a algunas funciones de utilidad como por ejemplo el acceso al rol(es) del usuario logueado, ejemplo:
this.User.Identity.Name
salu2
Hola Edel!!
Muchas gracias por el comentario.
Efectivamente para el caso particular de obtener el nombre del usuario en cualquiera de las páginas deberíamos usar la propiedad que nos indicas.
Sin embargo aunque en este caso hago uso de un componente en el que tengo una propiedad en la que obtengo fácilmente lo que planteo, va más enfocado a situaciones menos especificas como por ejemplo usar un contador o hacer algún tipo de cálculo en la página principal y poder disponer de ese valor en resto del site.
Aún así voy a indicarlo en el post para que no lleve a confusión.
Muchas gracias!!
Saludetes
Hola, te recomiendo que en lugar de una(o varias) varaibles sueltas uses una clase que te centralize el acceso a la infromacion de contexto(usuario,su perfil, o lo que sea), esta clase es la responable de almacenear el estado en algun lugar(por ejemplo en la sesion) la idea es que la aplicacion no sepa como y donde se guarda la informacion de contexto. no se si me he explicado:-)
Hola Jorge!!
muchas gracias por el apunte, me parece la solución más elegante de las planteadas.
Actualizando post …
Saludetes
Hola.
Hay otras estrategias que se pueden utilizar, la de la clase me parece buena pero para accesar los datos mas facil podrias crear una clase base que herede de la clase Page y hacer que tus paginas hereden de esta nueva clase y exponer las propidades de forma mas facil.
Recuerde que tambien existe el objeto HttpContext.Application que se comporta como una variable de Session pero su contexto es la aplicación por lo tanto es muy util para no duplicar información entre sessiones; es decir si hay datos que sirven para todoslos usuarios no ponerlos en el objeto session.
y por ultimo y tal vez mas importante de todos es el objeto Cache es lo mejor para persistir datos y no olviden combinarlo con SQLCahceDependency.
Saludos!!!!!!!!!!
Muy Buenas noches compañeros quizas es parte de mi ignorancia la verdad me he cansado de buscar y no he conseguido la solucion a mi problema… les comento rapidamente intento almacenar unas variables para toda mi aplicacion pero deseo hacerlo en un lugar centralizado he leido en varios tutoriales los beneficios que me trae usar el archivo global.asax… y lo he querido realizar aca…
pues bien… he querido emplear el metodo Session_Start y en realidad no me funciona lo que estoy deseando. y lo unico que quiero es que en el formulario me ubique los valores que deseo aca: colocare el codigo de los 3 archivos para que vean si me pueden ayudar por favor.
[B]Archivo Global.Asax[/B]
[CODE]
< %@ Application Language="C#" %>
< %@ Import Namespace="System" %>
< %@ Import Namespace="System.Web" %>
< %@ Import Namespace="System.Web.SessionState" %>
public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { // Code that runs on application startup
}
protected void Application_End(object sender, EventArgs e) { // Code that runs on application shutdown
}
protected void Application_Error(object sender, EventArgs e) { // Code that runs when an unhandled error occurs
}
protected void Session_Start(object sender, EventArgs e) { Session["var"] = "0"; Application["app"] = "1"; }
protected void Session_End(object sender, EventArgs e) { // Code that runs when a session ends. // Note: The Session_End event is raised only when the sessionstate mode // is set to InProc in the Web.config file. If session mode is set to StateServer // or SQLServer, the event is not raised.
} }
[/CODE]
[B]Archivo Session.aspx.cs[/B]
[CODE]
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.SessionState;
public partial class session : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Session[«var»] = «nueva de hoy»;
if (Session[«var»] == null)
etiqueta.Text = «Variable de session nula!»;
else
etiqueta.Text = «var sessi-> » + (string)(Session[«var»]);
string ap = (string)Application[«app»];
etiqueta2.Text = ap;
}
}
[/CODE]
[B]Archivo Session.aspx[/B]
[CODE]
< %@ Page Language="C#" AutoEventWireup="true" CodeFile="session.aspx.cs" Inherits="session" %>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
[/CODE]
PD: Al ejecutar mi aplicacion siempre me dice que la variable Session[«var»] es nula y la variable ap queda vacia… cuando en realidad deberian de tomar los valores «0» y «1» respectivamentee que es lo que les almaceno en global.asax o no se si es que me falta algo… en realidad estoy empezando con asp.net pero esto me ha fregado… muchisimas gracias…