È possibile inserire un _ViewStart.cshtml
file all'interno della /Views/Public
cartella che sovrascriverà quello predefinito nella /Views
cartella e specificare il layout desiderato:
@{
Layout = "~/Views/Shared/_PublicLayout.cshtml";
}
Per analogia potresti inserire un altro _ViewStart.cshtml
file nella /Views/Staff
cartella con:
@{
Layout = "~/Views/Shared/_StaffLayout.cshtml";
}
È inoltre possibile specificare quale layout deve essere utilizzato quando si restituisce una vista all'interno di un'azione del controller, ma è per azione:
return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);
Ancora un'altra possibilità è un filtro di azione personalizzato che avrebbe la precedenza sul layout. Come puoi vedere molte possibilità per raggiungere questo obiettivo. Spetta a te scegliere quale si adatta meglio al tuo scenario.
AGGIORNARE:
Come richiesto nella sezione commenti, ecco un esempio di filtro di azione che sceglierebbe una pagina principale:
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 quindi decorare un controller o un'azione con questo attributo personalizzato specificando il layout desiderato:
[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
return View();
}
Razor
vista, è sufficiente impostareLayout = null;