ASP.NET MVC Проверить роль внутри представления

В моем представлении у меня есть некоторые ссылки администратора, которые я хотел бы скрыть и показать в зависимости от роли пользователя, как это сделать внутри представления, например.

<%= if(CHECK IF USER ROLE ADMIN) { %>
        <div class="tools">
            <ul>
                <li class="edit"><%= Html.ActionLink("Edit", "Edit", new { id = Model.storyId }) %></li>
                <li class="delete"><%= Html.ActionLink("Delete", "Delete", new { id = Model.storyId }) %></li>
            </ul>
        </div>
<%= } %>

person Cameron    schedule 06.01.2011    source источник
comment
Возможно, вы захотите просто выполнить эту проверку в своем действии и поместить значение в хэш ViewData или в качестве свойства вашей модели представления, чтобы ваши представления были тупыми.   -  person R0MANARMY    schedule 06.01.2011
comment
Я бы предпочел просто проверить представление, используя простой оператор if. Я делал это раньше, но просто не могу вспомнить код.   -  person Cameron    schedule 06.01.2011
comment
То, что вы делали это раньше, не делает это хорошей идеей. Помните, что любой код (каким бы тривиальным он ни был), который вы помещаете в свое представление, — это код, для которого вы не можете (по крайней мере, легко) написать тесты или провести рефакторинг. Роб Коннери также недавно написал отличный пост на тему Избегание тегов Суп.   -  person R0MANARMY    schedule 06.01.2011
comment
Кроме того, что означает роль пользователя - администратор. Мы говорим об учетных данных Windows или определении вашего приложения для administrator?   -  person R0MANARMY    schedule 06.01.2011
comment
Я не вижу причин не иметь его в представлении, если это простая проверка роли для отображения ссылок. У меня также есть проверки в контроллере на соответствие методам Edit и Delete, поэтому у пользователей по-прежнему должен быть доступ, но я также хотел показать ссылки на нужных пользователей, чтобы упростить задачу. Я не вижу проблемы.   -  person Cameron    schedule 06.01.2011
comment
@ R0MANARMY Можете ли вы привести пример того, как вы это сделаете? Потому что, как я это вижу, если вы используете ViewData, вам все равно нужно проверить значение, чтобы узнать, отображать ли ссылки.   -  person Shawn Mclean    schedule 23.09.2011
comment
Является ли это хорошим безопасным подходом к безопасности, помещая свойство, связанное с безопасностью, в ViewModel, например. роль администратора? К вашему сведению, я только что сделал это сейчас и могу получить доступ к свойству ViewModel в представлении и соответственно показать/скрыть материал. Если нет, есть ли лучший и безопасный способ сделать это?   -  person Thomas Veil    schedule 14.03.2014


Ответы (2)


<% if (Page.User.IsInRole("Admin")){ %>

<%}%>

Однако, на мой взгляд, это ужасная идея. Лучше позволить ViewData или Model представлять то, что должно отображаться в представлении, и представление может просто проверять данные представления. Базовый класс контроллера или фильтр действий могут сделать повторяющееся использование очень простым и позволить коду существовать в одном месте.

person CRice    schedule 06.01.2011
comment
Я обычно использую ViewModel для отправки такой информации с контроллера. Однако я пытаюсь отобразить определенные вещи в моем основном _Layout.cshtml на основе ролей. Насколько ужасна эта идея и почему? Стоит ли создавать строго типизированные частичные представления только для того, чтобы добавить класс здесь и там, показывающий и скрывающий содержимое, или это выбор использования вспомогательного метода в моем _Layout? Я просто нервничаю из-за общих заявлений о том, что это ужасные идеи. - person Methodician; 23.01.2016
comment
Вы можете просто указать модель представления, что показывать, и отработать всю логику ваших ролей в контроллере (или классе, который использует контроллер) и соответствующим образом назначить модель представления. Прямая проверка по-прежнему работает, но будет менее удобна в сопровождении в более крупных проектах и ​​будет более беспорядочной для представления. - person CRice; 25.01.2016
comment
Вы можете сделать звонок, если это того стоит или нет, в зависимости от вашей ситуации. - person CRice; 25.01.2016
comment
Я в той же лодке, что и @Methodician, но не могу найти подходящих альтернатив. - person Sinjai; 17.08.2017

Я согласен с большинством других в том, что эти данные должны быть предоставлены «заранее определенными», если хотите, контроллером или другими бизнес-службами, в то время как представление просто использует, насколько это возможно, HTML-разметку и структуры управления языком для «конкретизации page», используя другие типичные инструменты для создания веб-страниц, такие как jquery, css и т. д. и т. д.

person Community    schedule 06.01.2011
comment
Я не совсем понимаю ваше утверждение, не могли бы вы перефразировать? - person Shawn Mclean; 23.09.2011
comment
Он имеет в виду, что в представлении не должно быть расширенной логики, кроме отображения чего-либо. Вся основная логика (бизнес-процессы, управление данными и права доступа, как описано здесь) должна выполняться контроллером, а результат храниться где-то для использования в представлении. - person Christophe; 21.01.2021