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

我是MVC的新手。 我希望能够隐藏一些用户的一些actionlinks。 说我有一个“创build”行动链接,我只希望pipe理员看到并点击。 我想在asp.net中使用某种“loggedintemplate”,但它似乎不能在剃刀中工作。

我可以使用某种代码块来检查当前用户和她的angular色,但这可能不是最佳实践吗?

我的index.cshtml ..

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

我的控制器..

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

我在过去创build了一个帮助函数,只有在满足如下条件时才返回输出:

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

所以你可以使用这个:

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

这样就清晰可辨

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

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

我修改了Richard的代码来提供一个可选的MvcHtmlString参数,如果评估是错误的返回。

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

如果你还没有启用roleManager ,你仍然想检查用户的angular色,你可以这样做:

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

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

理查德build议的解决scheme非常漂亮,不过正如Matthieu指出的,有人可能需要额外的HTML代码来渲染(或不渲染)。 因此,Matthieu的解决scheme似乎更广泛适用,我只是集中在扩展方法的哪些用户被视为pipe理员的逻辑。

扩展方法:

 public static bool IsAdmin(this WebViewPage page) { return page.User.IsInRole(@"Domain\ProjectAdmins"); } 

用法:

 @if (this.IsAdmin()) { <p> @Html.ActionLink("Create New Version", "Create") </p> } 

你可以添加一个函数到App_Code / ViewFunctions.cshtml(如果缺less就创build)

 @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; } 

要使用该function,只需将以下代码添加到视图中。

 @ViewFunctions.ConditionalActionLink( @Html.ActionLink("TextToDisplay", "SomeAction", new { Area = "SomeArea", Controller = "SomeController" }), new string[] { "administrator","jDoe", "someOtherUser" })