Как сделать необязательный рендеринг раздела в ASP.Net MVC 3?
На моем веб-сайте у меня есть раздел (плавающая боковая панель), который я хочу отображать только для подмножества пользователей (админов). Я надеюсь, что я могу поместить логику в макет мастера, чтобы определить, должен ли раздел отображаться или нет, но который вызывает ошибку на странице, если раздел не отображается.
Пример кода - Layout.cshtml...
... code ...
@if(user.IsAdmin) {
@RenderSection("AdminSidebar", false)
}
Пример кода - MyPage.cshtml...
@section AdminSidebar {
... code ...
}
Кто-нибудь знает, как заставить это работать без необходимости вводить логику на всех дочерних страницах?
Как примечание, IsSectionDefined ( "AdminSidebar" ) работает только в файле макета. Он не работает на странице, чтобы проверить, доступен ли раздел или нет.
Ответы
Ответ 1
Я не знаю, не злоупотребляет ли это фреймворком, но если вы действительно склонны идти таким путем, вы можете попробовать следующее:
@{
if(user.IsAdmin) {
@RenderSection("AdminSidebar", false)
}
else {
RenderSection("AdminSidebar", false).WriteTo(TextWriter.Null);
}
}
Ответ 2
В моем файле _Layout.cshtml я сделал что-то вроде этого:
@if(user.IsAdmin)
{
@Html.Partial("SideBar")
}
чтобы избежать того, чтобы все дочерние страницы имели дело с необязательным разделом по существу таким же образом. Когда я впервые попробовал опциональную секцию, я обнаружил, что повторяю себя на дочерних страницах, по крайней мере, в моей реализации.
Где я использовал вызов @RenderSection
для необязательных разделов, он обычно должен был предоставлять информацию, относящуюся к странице.
Ответ 3
Использование раздела для чего-то условного, основанного на уровне разрешений пользователей, для меня немного грязно. Я бы использовал RenderPartial (пользователь) и поместил логику в частичное.
@if(user.IsAdmin) {
..code..
}