Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
sp:aspnet [2009/08/14 20:15] alfred |
sp:aspnet [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 190: | Línea 190: | ||
| === GAC === | === GAC === | ||
| Como toda aplicación en .NET, las creadas con aspnet pueden acceder a los ensamblados ubicados en la //Global Assembly Cache//. | Como toda aplicación en .NET, las creadas con aspnet pueden acceder a los ensamblados ubicados en la //Global Assembly Cache//. | ||
| + | |||
| Línea 212: | Línea 213: | ||
| En el web.config podemos definir el tiempo que se mantiene la sesión activa (por defecto 20 minutos): | En el web.config podemos definir el tiempo que se mantiene la sesión activa (por defecto 20 minutos): | ||
| <code xml> | <code xml> | ||
| - | <sessionState | + | <configuration> |
| - | timeout="40" | + | <system.web> |
| - | /> | + | <sessionState timeout="40" /> |
| </code> | </code> | ||
| Si las cookies no están activas, la sesión puede ser tratada a partir de un identificador en la URL, para ello agregaremos lo siguiente al web.config: | Si las cookies no están activas, la sesión puede ser tratada a partir de un identificador en la URL, para ello agregaremos lo siguiente al web.config: | ||
| Línea 349: | Línea 350: | ||
| ===== Algunos elementos básicos ===== | ===== Algunos elementos básicos ===== | ||
| + | |||
| ==== Response ==== | ==== Response ==== | ||
| Línea 357: | Línea 359: | ||
| </code> | </code> | ||
| - | + | === Otros === | |
| - | + | * ''Clear'': Elimina lo que se ha escrito hasta ahora. | |
| - | + | * ''ContentType'': Indica el tipo de contenido que se envia para que según este sea tratado por el navegador. | |
| - | + | ||
| - | + | ||
| - | + | ||
| ==== Clase Page ==== | ==== Clase Page ==== | ||
| Línea 490: | Línea 488: | ||
| </code> | </code> | ||
| \\ \\ Hay que tener cuidado, porque si se genera un error mientras se maneja errores puede darse un bucle infinito. | \\ \\ Hay que tener cuidado, porque si se genera un error mientras se maneja errores puede darse un bucle infinito. | ||
| + | |||
| ==== Ciclo de vida de una página ASP.NET ==== | ==== Ciclo de vida de una página ASP.NET ==== | ||
| Línea 525: | Línea 524: | ||
| * Esquema del ciclo de vida página: {{sp:asp:ct.png?10|Esquema}} | * Esquema del ciclo de vida página: {{sp:asp:ct.png?10|Esquema}} | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== Cookies ==== | ||
| + | Las cookies son pequeños archivos de texto que se guardan en el ordenador del visitante de una web y que luego pueden ser recuperados. Los manejamos a partir del tipo ''System.Web.HttpCookie''. | ||
| + | |||
| + | === Crear una cookie === | ||
| + | Para crear una cookie simplemente creamos un objeto del tipo ''HttpCookie'' a partir de un identificador y de un valor (en el caso siguiente el identificador es ''subgurim'' y el valor la fecha actual). Podremos decir cuando queremos que la cookie caduque a partir de la propiedad ''Expires''. | ||
| + | <code csharp> | ||
| + | HttpCookie addCookie = new HttpCookie("subgurim", DateTime.Now.ToString()); | ||
| + | addCookie.Expires = DateTime.Today.AddDays(1).AddSeconds(-1); | ||
| + | Response.Cookies.Add(addCookie); | ||
| + | </code> | ||
| + | Podemos agregar la cookie de forma dinámica: | ||
| + | <code csharp> | ||
| + | Response.Cookies["userName"].Value = "patrick"; | ||
| + | Response.Cookies["userName"].Expires = DateTime.Now.AddDays(1); | ||
| + | </code> | ||
| + | |||
| + | === Coger las cookies del cliente === | ||
| + | Podemos recoger una cookie concreta a partir del método ''Request.Cookies.Get'': | ||
| + | <code csharp> | ||
| + | HttpCookie cogeCookie = Request.Cookies.Get("subgurim"); | ||
| + | </code> | ||
| + | También podremos cogerla a partir del identificador la lista: | ||
| + | <code csharp> | ||
| + | HttpCookie cogeCookie = Request.Cookies["subgurim"]; | ||
| + | </code> | ||
| + | Al estar en una lista podemos recorrer todas las cookies del cliente: | ||
| + | <code csharp> | ||
| + | foreach (HttpCookie cookie in Request.Cookies) { | ||
| + | Response.Write(cookie.Name + ":" + cookie.Value + "<br />"); | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | === Modificar y eliminar las cookies === | ||
| + | Podemos cambiar el valor de una cookie a partir del método ''Response.Cookies.Set'': | ||
| + | <code csharp> | ||
| + | HttpCookie modificaCookie = Request.Cookies.Get("subgurim"); | ||
| + | modificaCookie.Expires = DateTime.Now.AddDays(7); | ||
| + | modificaCookie.Value = "hi!"; | ||
| + | Response.Cookies.Set(modificaCookie); | ||
| + | </code> | ||
| + | O eliminarlas a partir del ''Response.Cookies.Remove'': | ||
| + | <code csharp> | ||
| + | Response.Cookies.Remove("subgurim"); | ||
| + | </code> | ||
| + | O eliminarlas todas: | ||
| + | <code csharp> | ||
| + | Response.Cookies.Clear(); | ||
| + | </code> | ||
| + | Aunque si existen problemas para la eliminación: | ||
| + | <code csharp> | ||
| + | HttpCookie c1 = Request.Cookies["userName"]; | ||
| + | if (c1 != null) | ||
| + | { | ||
| + | Request.Cookies.Remove("userName"); | ||
| + | c1.Expires = DateTime.Now.AddDays(-10); | ||
| + | c1.Value = null; | ||
| + | Response.SetCookie(c1); | ||
| + | } | ||
| + | </code> | ||
| + | === Cookies con varios valores === | ||
| + | Para crear una cookie con varios valores lo haremos como si fuese un array multidimensional. \\ | ||
| + | Para asignarla lo haremos así... | ||
| + | <code csharp> | ||
| + | Response.Cookies["userInfo"]["userName"] = "patrick"; | ||
| + | Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString(); | ||
| + | Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1); | ||
| + | </code> | ||
| + | O así: | ||
| + | <code csharp> | ||
| + | HttpCookie addMultiCookie = new HttpCookie("subgurimMultidimensional"); | ||
| + | for (int i = 0; i < 10; i++) { | ||
| + | addMultiCookie.Values.Add(i.ToString(), "Elemento " + i.ToString()); | ||
| + | addMultiCookie[i.ToString()] = "Elemento " + i.ToString(); | ||
| + | } | ||
| + | Response.Cookies.Add(addMultiCookie); | ||
| + | </code> | ||
| + | Y para recogerla de la siguiente forma: | ||
| + | <code csharp> | ||
| + | HttpCookie cogeMultiCookie = Request.Cookies.Get("subgurimMultidimensional"); | ||
| + | string valorCualquiera = cogeMultiCookie.Values.Get("5"); | ||
| + | </code> | ||
| ===== La interface de usuario ===== | ===== La interface de usuario ===== | ||
| + | |||
| Línea 606: | Línea 691: | ||
| } | } | ||
| </code> | </code> | ||
| + | Pero lo más aconsejable, si utilizamos hojas de estilos (css) es anidar los estilos de la siguiente forma: | ||
| + | <code css> | ||
| + | table.taula { ... } | ||
| + | table.taula td { ... } | ||
| + | table.taula th { ... } | ||
| + | table.taula tr.evenCell { ... } | ||
| + | table.taula tr.oddCell { ... } | ||
| + | table.taula td.evenCell { ... } | ||
| + | table.taula td.oddCell { ... } | ||
| + | table.taula td.littleEvenCell { ... } | ||
| + | table.taula td.littleOddCell { ... } | ||
| + | </code> | ||
| También podemos definir los estilos a partir de código: | También podemos definir los estilos a partir de código: | ||
| Línea 684: | Línea 780: | ||
| Label.skin | Label.skin | ||
| </code> | </code> | ||
| + | |||
| + | |||
| + | |||
| Línea 732: | Línea 831: | ||
| * Utilizar URL relativas de aplicación, donde ''~'' corresponde a la raíz de esta, algo así: ''<asp:Image ImageUrl="~/images/banner.gif" runat="server" />''. | * Utilizar URL relativas de aplicación, donde ''~'' corresponde a la raíz de esta, algo así: ''<asp:Image ImageUrl="~/images/banner.gif" runat="server" />''. | ||
| - | La directiva ''MasterType'' especifica la ruta de la página maestra: | + | Las Master Pages también pueden contener otras Master Pages, por ejemplo, podríamos tener una Master Page que represente la cabecera/pie de página y la navegación global del sitio, y después Master Pages separadas que deriven de esta para definir los aspectos de las diferentes sub-secciones del sitio. |
| + | |||
| + | === Comunicación entre la MasterPage y el contenido === | ||
| + | Cuando utilizamos la directiva ''MasterType'' en un WebForm estamos especificando el tipo del que será la página maestra. Esto significa que al acceder a la propiedad ''Master'' de la ''Page'' tendremos también acceso a sus propiedades. Si utilizamos MasterPages anidadas no podremos acceder a los datos de la raíz desde el WebForm, pero como lo que realmente estamos indicando es el tipo podemos hacer que las MasterPages hereden de un tipo concreto y en la directiva ''MasterType'' indicar ese. | ||
| <code> | <code> | ||
| <%@ MasterType VirtualPath="Site.master" %> | <%@ MasterType VirtualPath="Site.master" %> | ||
| Línea 742: | Línea 844: | ||
| AdRotator ad = (AdRotator)Master.FindControl("MyAdRotator"); | AdRotator ad = (AdRotator)Master.FindControl("MyAdRotator"); | ||
| </code> | </code> | ||
| + | Para comunicar desde la MasterPage al contenido lo que haremos será lanzar un evento. | ||
| - | Las Master Pages también pueden contener otras Master Pages, por ejemplo, podríamos tener una Master Page que represente la cabecera/pie de página y la navegación global del sitio, y después Master Pages separadas que deriven de esta para definir los aspectos de las diferentes sub-secciones del sitio. | + | === Notas === |
| - | + | * La MasterPage inserta la el WebForm entre los eventos ''PreInit'' e ''Init''. | |
| - | + | * Podemos indicar la MasterPage por código, pero antes del evento ''PreInit'' mediante la propiedad ''MasterPageFile'' del objeto Page. | |
| - | + | * Podemos indicar la MasterPage por defecto a partir del fichero de configuración: | |
| - | + | <code xml> | |
| + | <configuration> | ||
| + | <system.Web> | ||
| + | <pages master="otc.master" /> | ||
| + | </system.Web> | ||
| + | </configuration> | ||
| + | </code> | ||
| ===== Seguridad ===== | ===== Seguridad ===== | ||
| Línea 757: | Línea 865: | ||
| ===== WebServices ===== | ===== WebServices ===== | ||
| + | |||
| + | |||
| + | |||
| Línea 796: | Línea 907: | ||
| } | } | ||
| </code> | </code> | ||
| + | * En el ''HttpContext'' podemos recoger los parámetros mediante la ''QueryString'' (GET) o el ''Form'' (POST). | ||
| + | * Si el controlador necesita leer la sesión del usuario que hace la petición necesitará implementar la interfaz ''System.Web.SessionState.IReadOnlySessionState'', si además necesitase guardarla implementaría la ''IRequiresSessionState''. | ||
| ===== Notas ===== | ===== Notas ===== | ||
| + | |||
| + | |||
| ==== Como... ==== | ==== Como... ==== | ||
| === Agregar una librería === | === Agregar una librería === | ||
| Línea 807: | Línea 922: | ||
| <code xml> | <code xml> | ||
| <scs:ScsComboBox ID="dest" runat="server" EnableDefaultItem="false" Width="100px"/> | <scs:ScsComboBox ID="dest" runat="server" EnableDefaultItem="false" Width="100px"/> | ||
| + | </code> | ||
| + | === Saber ubicación de la aplicación en disco === | ||
| + | Como lo hacemos en cualquier aplicación .NET simplemente tendríamos que consultar: | ||
| + | <code csharp> | ||
| + | string bdir = System.AppDomain.CurrentDomain.BaseDirectory; | ||
| + | </code> | ||
| + | === Acceder al Request\Response sin tener acceso a la clase Page === | ||
| + | <code csharp> | ||
| + | HttpContext.Current.Request.MapPath("~/"); | ||
| </code> | </code> | ||