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" })