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