3.1 Themes

Los themes son necesarios porque para personalizar algunos controles de .NET no basta con las hojas de estilos.

Para guardar el theme debe crearse una carpeta llamada App_Theme y dentro de ella otra carpeta por cada theme. Dentro de los themes podemos tener tantos archivos skin como queramos.

Los ficheros de skin contienen listas de controles web personalizados: por ejemplo, cajas de texto de determinado color.

Aplicación de themes
Para aplicarlos hay distintas maneras. Para aplicar un theme por página debemos meter en la directiva <%@ Page el atributo Theme:
<%@ Page Language=... Theme="SuperTheme" %>

Para establecer el theme en toda la web a través del web.config:
...
<system.web>
<pages theme="SuperTheme" />
</system.web>
...

En la programación también podemos cambiar el theme al vuelo, pero hay que hacerlo en la fase Page_PreInit:

protected void Page_PreInit (object sender, EvenArgs e)
{
// Vamos a suponer que establecemos un theme a través de una variable de sesión
if (Session["Theme"] == null)
{
// no hay theme, o dejamos en blanco o ponemos uno por defecto
Page.Theme = "";
}
else
{
Page.Theme = (String)Session["MiTema"];
}
}

Estilos
Se pueden incluir ficheros css para que los themes tengan estilos. Los ficheros deben meterse en la carpeta del theme y luego hay que hacer un pequeño cambio en la página para que incluya el css: convertir el head en un control de servidor poniéndole en runat.
...
<head runat="server">
</head>
...
En caso de conflicto entre las propiedades de un control y el theme, el theme gana.

3.2 Master Pages

Las master pages son páginas asp.net que sirven como plantilla a una web. La master page debe crearse como un nuevo elemento o a partir de una página ya hecha. Está página se personaliza y se pone a punto por un lado y por otro se establecen los placeholders, es decir lugares de la página donde meteremos contenido cambiante. Para agregar una masterpage, entre todas las opciones debemos seleccionar la de "página principal".

Para personalizar la página podemos meter diseño de bloques, hojas de estilo y todo lo habitual. Aquí tenemos parte de una masterpage. Podemos ver que cambia la declaración y que se meten placeholders como el del title:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title> <asp:ContentPlaceHolder id="head" runat="server">
</asp:ContentPlaceHolder>
</title>

<link href="StyleSheet.css" rel="stylesheet" type="text/css" />
</head>
<body>
...

Lo siguiente es crear páginas de contenido. Se pueden crear a mano y luego personalizar (hay que quitar etiquetas <body> etc...), pero a través de visual studio lo hace automático y creando todos las etiquetas necesarias.

Para eso agregamos una nueva página y seleccionamos el checkbox de página principal. Ahí seleccionamos una master page y el visual nos crea una página con etiquetas Content. Esas Content se corresponden con los placeholders de la master:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Inicio.aspx.cs" Inherits="Inicio" Title="Página sin título" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
Este es el inicio
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<h1>Inicio</h1>
Este es el inicio
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="pie" Runat="Server">
Página generada superRápido
</asp:Content>

Si desde código quisieramos alterar partes de la página master, en la clase de la master tendríamos que meter métodos set/get para hacerlos accesibles.

Puede cambiarse la master page al vuelo desde código usando la propiedad: Page.Master
Tambien en el web.config se puede establecer la página master:
...
<system.web>
<pages masterPageFile="SuperMaster.master" />
</system.web>
...