Я хотел бы иметь 2 отдельных макета в моем приложении. Скажем, один из них относится к публичному разделу веб-сайта, а другой относится к стороне участника.
Для простоты можно сказать, что вся логика для каждого из этих сайтов аккуратно завернута в два разных контроллера.
- PublicController
- StaffController
И каждый из них имеет соответствующий макет для всех представлений под каждым.
- _PublicLayout.cshtml
- _StaffLayout.cshtml
Как использовать файл _ViewStart.cshtml, чтобы указать, что все View/Action в разделе "Public" используют PublicLayout, а все в разделе "Персонал" используют StaffLayout?
Спасибо!
Ответ 1
Вы можете поместить файл _ViewStart.cshtml
внутри папки /Views/Public
, который переопределит значение по умолчанию в папке /Views
и укажите желаемый макет:
@{
Layout = "~/Views/Shared/_PublicLayout.cshtml";
}
По аналогии вы можете поместить еще один файл _ViewStart.cshtml
в папку /Views/Staff
с помощью:
@{
Layout = "~/Views/Shared/_StaffLayout.cshtml";
}
Вы также можете указать, какой макет следует использовать при возврате представления внутри действия контроллера, но для каждого действия:
return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);
Еще одна возможность - это настраиваемый фильтр действий, который переопределяет макет. Как вы можете видеть много возможностей для достижения этого. Вы можете выбрать, какой из них лучше всего подходит в вашем сценарии.
UPDATE:
В соответствии с запросом в разделе комментариев здесь приведен пример фильтра действий, который выбирает главную страницу:
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;
}
}
}
а затем украсить контроллер или действие с помощью этого настраиваемого атрибута, определяющего требуемый макет:
[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
return View();
}
Ответ 2
Еще один метод - определить макет внутри представления:
@{
Layout = "~/Views/Shared/_MyAdminLayout.cshtml";
}
Больше способов сделать, можно найти здесь, надеюсь, что это поможет кому-то.
Ответ 3
Этот метод является самым простым способом для новичков контролировать рендеринг макетов в вашем приложении ASP.NET MVC. Мы можем идентифицировать контроллер и отображать макеты как парсер, чтобы сделать это, мы можем написать наш код в файле _ViewStart в корневом каталоге папки "Представления". Ниже приведен пример того, как это можно сделать.
@{
var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
string cLayout = "";
if (controller == "Webmaster") {
cLayout = "~/Views/Shared/_WebmasterLayout.cshtml";
}
else {
cLayout = "~/Views/Shared/_Layout.cshtml";
}
Layout = cLayout;
}
Прочитайте полную статью здесь "Как визуализировать различные макеты в ASP.NET MVC"