Общие советы по ролям
То, как я это сделал, - это создание собственного принципала и хранение там необходимой дополнительной информации. В вашем примере это будет как минимум включать роли для пользователя. Таким образом, вы избегаете множества дополнительных поездок в хранилище пользователей (которое, вероятно, является базой данных SQL).
Посмотрите на мой вопрос, в котором я даю код, который я успешно использую: Является ли этот пользовательский принципал в базовом контроллере ASP.NET MVC 3 ужасно неэффективным?
Обратите внимание, что я храню пользовательский принципал в кеше, а не в сеансе (просто параноидально по поводу перехвата сеанса).
Мне нравится этот подход, так как он очень расширяемый. Например, с тех пор я расширил это, чтобы предоставить учетные данные Facebook, когда пользователь входит в систему через Facebook.
Просто помните, что если вы кешируете данные, вы должны помнить, чтобы обновлять их при изменении!
Ответ на ваш вопрос
Просто добавьте, что в вашем конкретном случае вы, вероятно, должны хранить эту дополнительную информацию в ViewModel
, и тогда ваше мнение скажет что-то вроде:
@if(ShowReports) { <li id="ReportTab">@Html.ActionLink("Reports", "Index", "Reports")</li> }
@if(ShowDashboard) { <li id="DashboardTab">@Html.ActionLink("Dashboard", "Dashboard", "Admin")</li> }
@if(ShowAdmin { <li id="AdminTab">@Html.ActionLink("Admin", "Index", "Admin")</li> }
с кодом ViewModel, говорящим что-то вроде:
public bool ShowReports {get;set;}
public bool ShowDashboard {get;set;}
public bool ShowAdmin {get;set;}
public void SetViewModel()
{
if (User.Identity.IsAuthenticated)
{
if (HttpContext.Current.User.IsInRole("Reporters"))
{
ShowReports = true;
}
if (HttpContext.Current.User.IsInRole("Administrators"))
{
ShowDashboard = true;
ShowAdmin = true;
}
}
}
На самом деле я стремлюсь сделать еще один шаг вперед и создать ReportsLink
в моем ViewModel
и установить в нем ссылку, если пользователь авторизован, или пустую строку, если это не так. Тогда вид просто говорит:
@Model.ReportsLink
@Model.DashboardLink
@Model.AdminLink
В этом случае соответствующая часть ViewModel может выглядеть следующим образом:
ReportLink = new MvcHtmlString(HtmlHelper.GenerateLink(HttpContext.Current.Request.RequestContext, System.Web.Routing.RouteTable.Routes, "linktext", "routename", "actionname", "controllername", null, null));