asp.net MVC3 razor:根据用户角色显示actionlink

时间:2011-08-08 12:08:43

标签: c# asp.net-mvc-3 razor

我是MVC的新手。我希望能够为某些用户隐藏一些动作链接。假设我有一个“创建”动作链接,我只希望管理员查看并单击。我想在asp.net中使用某种“loggedmpmplate”,但它似乎不适用于剃刀。

我可以使用某种代码块和if语句检查当前用户及其角色,但这可能不是最佳做法?

我的index.cshtml ..

// want some adminauth attribute here...
@Html.ActionLink("Create New", "Create")

我的控制器..

// GET: /Speaker/Create
[Authorize(Roles = "Administrators")]
public ActionResult Create()
{
    return View();
}

6 个答案:

答案 0 :(得分:136)

我过去创建了一个辅助函数,只在符合条件时才返回输出:

public static MvcHtmlString If(this MvcHtmlString value, bool evaluation)
{
     return evaluation ? value : MvcHtmlString.Empty;
}

所以你可以使用它:

@Html.ActionLink("Create New", "Create").If(User.IsInRole("Administrators"))

这种方式清晰易读

答案 1 :(得分:41)

如果你想要一个代码块,那将在视图中执行:

@if (Roles.IsUserInRole("Administrators"))
{
  <li>@Html.ActionLink("Create New", "Create")</li>
}

答案 2 :(得分:7)

我修改了Richard的代码,以便在评估为false时提供可选的MvcHtmlString参数。

public static MvcHtmlString If(this MvcHtmlString value, bool evaluation, MvcHtmlString falseValue = default(MvcHtmlString))
        {
            return evaluation ? value : falseValue;
        }

答案 3 :(得分:2)

如果您尚未启用roleManager并且仍想检查用户的角色,则可以这样执行:

 @if (@User.IsInRole("administrator"))
 {
   @Html.ActionLink("Create New Version", "Create")
 }

我们在这里做的是,我们只是访问用户的属性。如果您自己管理角色,这可能很有用。

答案 4 :(得分:0)

Richard建议的解决方案非常漂亮,但Matthieu指出有人可能需要额外的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>
}

答案 5 :(得分:0)

您可以向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" })