Ci sono due casi:
1-Devi gestire diversi template per lo stesso sito, tutto quello che ti serve è decidere quale file di layout deve essere usato come "pagina master". La cosa puo essere facilmente gestibile in _Viewstart.cshtml (che è stato fatto apposta per questo). Carichi il nome del file di layout dal db (o come nell'esempio che segue dal web.config, non ha importanza in fondo) e lo usi come layout.
codice:
@using System.Configuration;
@{
string template = ConfigurationManager.AppSettings["Template"].ToString();
Layout = template;
}
Se (caso estremo) vuoi creare il template dinamicamente dalla tua applicazione non puoi memorizzare la sintassi razor nel db e richiamarla ma devi passare comunque per la creazione del file di layout, memorizzare nel db il percorso di questo file e caricarlo come sopra.
2-hai due (o piu) layout diversi in base alle action (per esempio io generalmente ho un layout per il sito e uno diverso per il backend) e vuoi decidere action per action quale layout utilizzare. La scelta non puoi piu farla nel _ViewStart (tropo tardi) ma nella action stessa. Esistono diverse soluzioni poco eleganti (come rinunciare al _ViewStart, o passare ogni volta il nome del file di layout al metodo View) oppure usi questa actionfilter (che ho scopiazzato da internet, che uso e che è molto comoda) che non fa altro che passare alla view il layout specificato come attribbuto.
codice:
public class LayoutInjecterAttribute : ActionFilterAttribute
{
private readonly string _masterName;
public LayoutInjecterAttribute(string masterName)
{
_masterName = masterName;
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
var result = filterContext.Result as ViewResult;
if (result != null)
{
result.MasterName = _masterName;
}
}
}
e la usi cosi
codice:
[LayoutInjecter("_Layout")]
public ActionResult Index()
{
return View();
}