Макет MVC 3 и контроллеры
-
27-10-2019 - |
Вопрос
Я строю приложения MVC 3. Приложение должно иметь возможность отобразить другой макет в соответствии с подпаленом (например: customer1.mysite.com -> layout1; customer2.mysite.com -> layout2; и т. Д.) У него также будет макет для мобильных Т.е. 6.
Я видел, что это _viewstart.cshtml, которую я могу использовать, чтобы сделать логику для установки макета. Но то, чего я не понимаю, это то, где это контроль за это? Стоит ли написать весь код в представлении?
Еще один вопрос с макетом, как вывести код для общего поведения? У вас есть контрольчик для этого?
И последний я видел концепцию областей в ASP.NET MVC2, это устаревшая теперь, когда у нас есть бритва?
спасибо за помощь
Фред
Решение
Хотя вы могли бы сделать это в _ViewStart, я думаю, что лучшим способом будет написать Индивидуальный просмотр двигателя в котором на основе пользовательского агента или домена включают другой макет. Тогда у вас будут общие контроллеры и представления, только макет будет отличаться.
Другие советы
Это звучит как хорошее время для использования Viewbag.
Идея в том, что во время OnactionExecuting, вы бы посмотрели в поддоде и засунул его в Viewbag. Это можно сделать в пользовательском базовом концертлере, от которого наследуют другие ваши контроллеры, или от ActionFilter.
Затем в вашем _viewStart вы можете написать оператор Switch на Viewbag для управления макетом.
Например, здесь есть ActionFilter, который будет заполняться @ViewBag.Subdomain
В любом из ваших просмотров бритвы, включая _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);
}
}
Затем украсьте свои контроллеры этим новым [AddSubdomainToViewData]
атрибут.
Наконец, в _viewstart.cshtml сделайте что -то вроде этого:
@{
Layout = "~/Views/Shared/" + ((@ViewContext.ViewData["Subdomain"] as String) ?? String.Empty) + "_layout.cshtml";
}
Это будет использовать различную компоновку бритвы для каждого поддомена.