Question

Je construis une application MVC 3. L'application devrait être en mesure d'afficher une disposition différente en fonction du sous domaine (ex: customer1.mysite.com -> Présentation1; customer2.mysite.com -> Layout2, etc ...) il aura aussi une mise en page pour mobile et IE 6.

J'ai vu que leur est le _ViewStart.cshtml que je peux tirer parti de faire la logique pour définir la mise en page. Mais ce que je ne comprends pas est où est le controleur pour cela? Dois-je écrire tout le code dans la vue?

Une autre question avec la mise en page comment vous faire factoriser le code pour les comportements communs? Avez-vous un controleur pour cela?

Et un dernier je l'ai vu le concept des zones en asp.net MVC2 est obsolète maintenant que nous avons Razor?

Merci pour votre aide

Fred

Était-ce utile?

La solution

Alors que vous pouvez le faire dans le _ViewStart Je pense qu'une meilleure façon serait d'écrire un personnalisée vue moteur dans lequel basée sur l'agent utilisateur ou le domaine comprend une mise en page différente. Ensuite, vous auriez des contrôleurs communs et des vues, seule la mise en page sera différent.

Autres conseils

Cela sonne comme un bon moment pour utiliser ViewBag .

L'idée est que pendant OnActionExecuting , vous rechercher le sous-domaine et le fourrer dans la ViewBag. Cela peut se faire dans un BaseController personnalisé à partir duquel vos autres contrôleurs héritent ou d'un ActionFilter .

Ensuite, dans votre _ViewStart, vous pouvez écrire une instruction switch sur ViewBag à la mise en page de commande.

Par exemple, voici un ActionFilter qui peupler @ViewBag.Subdomain dans l'un de vos points de vue Razor, y compris _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);
    }
}

Ensuite, décorer vos contrôleurs avec ce nouvel attribut [AddSubdomainToViewData].

Enfin, _ViewStart.cshtml, faire quelque chose comme ceci:

@{
    Layout = "~/Views/Shared/" + ((@ViewContext.ViewData["Subdomain"] as String) ?? String.Empty) + "_layout.cshtml";
}

utilisera une autre mise en page de rasoir pour chaque sous-domaine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top