我是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();
}
答案 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" })