Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在ASP.NETMVC视图中显示/隐藏链接_Asp.net Mvc_Permissions_Views_Url - Fatal编程技术网

Asp.net mvc 在ASP.NETMVC视图中显示/隐藏链接

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

我试图找出如何根据用户的角色显示/隐藏链接。我知道如何设置动作方法的authorize属性,但是如果用户是我的角色数据库中的管理员或经理,我很难在视图中显示隐藏链接


有人能给我指出什么好的文章或代码示例吗?

在您看来,您可以通过
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);
    }
}