MVC 3 Layout e controllori
-
27-10-2019 - |
Domanda
I m la costruzione di un MVC 3 applicazioni. L'applicazione dovrebbe essere in grado di visualizzare un formato diverso a seconda del sub domaine (es: customer1.mysite.com -> Layout1; customer2.mysite.com -> Layout2; ecc ...) avrà anche un layout per cellulari e IE 6.
ho visto che la loro è la _ViewStart.cshtml che posso sfruttare per fare la logica per impostare il layout. Ma quello che non capisco è dove è il controler per questo? Dovrei scrivere tutto il codice nella vista?
Un altro problema con il layout come fare voi fattore fuori il codice per i comportamenti comuni? Avete un controler per questo?
E un ultimo che ho visto il concetto di aree in asp.net MVC2 è obsoleta adesso che abbiamo rasoio?
Grazie per il vostro aiuto
Fred
Soluzione
Mentre si potrebbe fare questo nel _ViewStart penso che il modo migliore sarebbe quello di scrivere un personalizzato vista motore in cui basato sul programma utente o il dominio includono un layout diverso. Poi si avrebbe controller comuni e punti di vista, solo il layout sarà diverso.
Altri suggerimenti
Questo suona come un buon momento per l'uso ViewBag .
L'idea è che durante OnActionExecuting , si dovrebbe cercare il sottodominio e spingerlo nella ViewBag. Questo può essere fatto in un BaseController personalizzato da cui gli altri controller ereditano, o da un ActionFilter .
Poi, nel vostro _ViewStart, è possibile scrivere un'istruzione switch su ViewBag a disposizione dei comandi.
Per esempio, qui è un ActionFilter che popoleranno @ViewBag.Subdomain
in uno qualsiasi dei vostri punti di vista Razor, tra cui _ViewStart.cshtml.
public class AddSubdomainToViewDataAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var subdomain = filterContext.HttpContext.Request.Url.Authority.Split('.').First();
var controller = filterContext.Controller as Controller;
controller.ViewData.Add("Subdomain", subdomain);
}
}
Poi, decorare i controller con questo nuovo attributo [AddSubdomainToViewData]
.
Infine, in _ViewStart.cshtml, fare qualcosa di simile:
@{
Layout = "~/Views/Shared/" + ((@ViewContext.ViewData["Subdomain"] as String) ?? String.Empty) + "_layout.cshtml";
}
In questo modo utilizzare un layout Razor diverso per ogni sottodominio.