Asp.net mvc 在ASP.NETMVC视图中显示/隐藏链接
我试图找出如何根据用户的角色显示/隐藏链接。我知道如何设置动作方法的authorize属性,但是如果用户是我的角色数据库中的管理员或经理,我很难在视图中显示隐藏链接Asp.net mvc 在ASP.NETMVC视图中显示/隐藏链接,asp.net-mvc,permissions,views,url,Asp.net Mvc,Permissions,Views,Url,我试图找出如何根据用户的角色显示/隐藏链接。我知道如何设置动作方法的authorize属性,但是如果用户是我的角色数据库中的管理员或经理,我很难在视图中显示隐藏链接 有人能给我指出什么好的文章或代码示例吗?在您看来,您可以通过System.Web.Mvc.ViewPage的user属性引用IPrincipal用户 例如,在你看来,你可以有如下情况: <% if (User.IsInRole("Admin")) { %> <%= Html.ActionLink("Admi
有人能给我指出什么好的文章或代码示例吗?在您看来,您可以通过
System.Web.Mvc.ViewPage
的user
属性引用IPrincipal
用户
例如,在你看来,你可以有如下情况:
<% if (User.IsInRole("Admin")) { %>
<%= Html.ActionLink("Admin only link", "Edit", "Users") %>
<% } %>
<% if (User.IsInRole("Manager") || User.IsInRole("Admin")) { %>
<%= Html.ActionLink("Manager & Admin only link", "Edit", "Product") %>
<% } %>
HTHs,Charles这是我非常不喜欢MVC的一件事(就像ASP.NETMVC,而不是模式一样),有一种倾向是将UI逻辑移动到标记中 一旦该逻辑在aspx中运行,就无法对其运行单元测试 Personly我认为具有合适UI模式(MVC或MVP等)的webforms比页面上充斥着无法测试的条件逻辑更适合
<% if(HttpContext.Current.User.IsInRole("Admin")){%> <a href="/Admin">Admin</a> <% } %>
使用此代码。这更容易。我使用静态类进行角色验证,在我使用的cshtml中,角色验证是在cshtml之外进行的 我在数据库中有我的授权功能或内容(按用户或按角色),所以如果访问定义更改,您不必重新部署
public static class AuthorizeContent
{
public static bool AuthorizeAccessContent(string Content)
{
bool bReturn = false;
DBContext db = new DBContext();
string[] RolesUser = Roles.GetRolesForUser(WebSecurity.CurrentUserName);
foreach (AuthorizedContentRole aut in db.AuthorizedContentRole)
{
foreach (string rol in RolesUser)
{
if (aut.Role==rol && aut.Content==Content)
{
bReturn = true;
break;
}
}
}
foreach (AuthorizedContentUser aut in db.AuthorizedContentUser)
{
if (aut.UserName == WebSecurity.CurrentUserName && aut.Content == Content)
{
bReturn = true;
break;
}
}
return bReturn;
}
///在cshtml中
@if (AuthorizeContent.AuthorizeAccessContent(Content))
{
<li class="two">
<h5>Administrator link</h5>
@Html.ActionLink("Admin secret info","Index", "Information")
</li>
}
谢谢这里有一个转折点-我在母版页中有我的选项卡链接,我想为某些角色显示一个选项卡。你知道我如何为IPrincipal添加对我的master的引用吗?使用
HttpContext.Current.user
或ViewContext.HttpContext.user
-这应该可以做到:-)啊,现在我可以继续了。。。我感谢你的帮助!因为我仍然认为自己是初学者,我正变得越来越好,我完全同意你所说的话,并且在我的标记页上都是乱七八糟的。我在我的日常工作中使用webforms,在我的自由职业项目中使用MVC,在同时学习这两个项目时,我遇到了许多相互矛盾的难题。虽然我还没有学到很多关于如何进行单元测试的知识,但在不久的将来,我无疑会需要它;我希望届时MVC团队能够解决这个问题。感谢您的评论+1-使用Selenium进行UI测试。您可以使用不同的角色运行测试,然后测试HTML控件是否存在(嘿,这很有意思)。
public class AccionAuthorizeAttribute : AuthorizeAttribute
{
public string Action { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
filterContext.Result = new HttpUnauthorizedResult();
else if (!AutorizacionContenido.AutorizaAccesoContenido(Action))
filterContext.Result = new HttpUnauthorizedResult();
base.OnAuthorization(filterContext);
}
}