Asp.net MVC3 бритва: отображение actionlink на основе роли пользователя
Я новичок в MVC. Я хочу, чтобы иметь возможность скрывать некоторые actionlinks для некоторых пользователей. Скажем, у меня есть "create" actionlink, который я хочу, чтобы администраторы могли видеть и кликать. Я хочу использовать какой-то "loggedintemplate", доступный в asp.net, но он не работает в бритве.
Я мог бы использовать какой-то блок кода с инструкцией if, проверяющей текущего пользователя и ее роль, однако это может быть не самая лучшая практика?
my index.cshtml..
// want some adminauth attribute here...
@Html.ActionLink("Create New", "Create")
мой контроллер..
// GET: /Speaker/Create
[Authorize(Roles = "Administrators")]
public ActionResult Create()
{
return View();
}
Ответы
Ответ 1
В прошлом я создал вспомогательную функцию, чтобы возвращать результат только тогда, когда критерии выполняются следующим образом:
public static MvcHtmlString If(this MvcHtmlString value, bool evaluation)
{
return evaluation ? value : MvcHtmlString.Empty;
}
чтобы вы могли использовать это:
@Html.ActionLink("Create New", "Create").If(User.IsInRole("Administrators"))
Таким образом, это разборчиво и коротко
Ответ 2
Если вам нужен блок кода, который будет выглядеть в представлении:
@if (Roles.IsUserInRole("Administrators"))
{
<li>@Html.ActionLink("Create New", "Create")</li>
}
Ответ 3
Я изменил код Ричарда, чтобы предоставить необязательный параметр MvcHtmlString для возврата, если оценка неверна.
public static MvcHtmlString If(this MvcHtmlString value, bool evaluation, MvcHtmlString falseValue = default(MvcHtmlString))
{
return evaluation ? value : falseValue;
}
Ответ 4
Если вы не включили roleManager
, и вы все еще хотите проверить роль пользователя, вы можете сделать это следующим образом:
@if (@User.IsInRole("administrator"))
{
@Html.ActionLink("Create New Version", "Create")
}
Что мы здесь делаем, мы просто получаем доступ к свойствам пользователя. Это может быть полезно, если вы сами управляете ролями.
Ответ 5
Решение, предложенное Ричардом, действительно красиво, хотя, как заметил Маттие, кому-то может понадобиться дополнительный HTML-код, который будет отображаться (или не отображаться).
Таким образом, решение Matthieu представляется более широко применимым, я бы просто централизовал логику, по которой пользователи считаются админами в методе расширения.
Метод расширения:
public static bool IsAdmin(this WebViewPage page)
{
return page.User.IsInRole(@"Domain\ProjectAdmins");
}
Использование:
@if (this.IsAdmin())
{
<p>
@Html.ActionLink("Create New Version", "Create")
</p>
}
Ответ 6
Вы можете добавить функцию в App_Code/ViewFunctions.cshtml(создать, если отсутствует)
@using System.Web.Mvc;
@functions{
public static object ConditionalActionLink(object actionLink, ICollection<string> arrAuthUsers)
{
bool objIsVisible = arrAuthUsers
.Select(s => User.IsInRole(s))
.Where(s => s.Equals(true))
.Any();
return (objIsVisible)
? actionLink
: MvcHtmlString.Empty;
}
Чтобы использовать эту функцию, просто добавьте следующий код в представление.
@ViewFunctions.ConditionalActionLink(
@Html.ActionLink("TextToDisplay", "SomeAction", new { Area = "SomeArea", Controller = "SomeController" }),
new string[] { "administrator","jDoe", "someOtherUser" })