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/15 19:38] 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 526: | 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}} | ||
| + | |||
| + | |||
| Línea 576: | Línea 576: | ||
| Response.Cookies.Clear(); | Response.Cookies.Clear(); | ||
| </code> | </code> | ||
| - | + | Aunque si existen problemas para la eliminación: | |
| - | === Cookies multidimensionales === | + | <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 659: | 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 737: | Línea 780: | ||
| Label.skin | Label.skin | ||
| </code> | </code> | ||
| + | |||
| + | |||
| + | |||
| Línea 785: | 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 795: | 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 810: | Línea 865: | ||
| ===== WebServices ===== | ===== WebServices ===== | ||
| + | |||
| + | |||
| + | |||
| Línea 849: | 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 860: | 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> | ||