ASP.NET MVC中如何在视图中检查角色

31

在我的视图中,我有一些管理链接,我希望根据用户角色隐藏和显示它们,我应该如何在视图内实现这个功能?例如:

<%= if(CHECK IF USER ROLE ADMIN) { %>
        <div class="tools">
            <ul>
                <li class="edit"><%= Html.ActionLink("Edit", "Edit", new { id = Model.storyId }) %></li>
                <li class="delete"><%= Html.ActionLink("Delete", "Delete", new { id = Model.storyId }) %></li>
            </ul>
        </div>
<%= } %>

8
你可能想在你的操作中执行这个检查,并将值放入ViewData哈希表或作为视图模型上的属性,以保持你的视图简单。 - Roman
1
仅仅因为你以前做过并不意味着它是一个好主意。请记住,您放入视图中的任何代码(无论多么琐碎)都是您无法轻易编写测试或重构的代码。Rob Connery之前也在避免标签汤方面撰写了一篇很棒的文章。 - Roman
另外,“用户角色是管理员”是什么意思?我们是在谈论Windows凭据还是您的应用程序对“管理员”的定义? - Roman
1
如果只是一个简单的检查角色以显示链接,我认为将其放在视图中是没有问题的。此外,我还在控制器中对编辑和删除方法进行了检查,因此用户仍然必须具有访问权限,但我也希望向正确的用户显示链接,使其更加方便。我看不出有任何问题。 - Cameron
这是一种好的安全保护方法吗?例如,在ViewModel中放置一个与安全相关的属性,比如AdministratorRole?顺便说一下,我刚刚做到了这一点,可以在视图中访问ViewModel属性并相应地显示/隐藏“东西”。如果不是,有更好、更安全的方法吗? - OpcodePete
显示剩余2条评论
3个回答

65
@if (this.User.IsInRole("Administrator"))
{

}

27
<% if (Page.User.IsInRole("Admin")){ %>

<%}%>

但在我看来,这是一个可怕的想法。更好的做法是让ViewData或Model代表视图要显示的内容,视图只需检查视图数据即可。控制器基类或操作筛选器可以重复使用这个非常简单的功能,并且允许代码存在于一个地方。


1
我通常使用ViewModel从控制器发送此类信息。但是,我正在尝试根据角色在我的主_Layout.cshtml中显示某些内容。这个想法有多“糟糕”,为什么?是否值得创建强类型的部分视图来添加一个类,以此来显示和隐藏内容,或者只是在我的_Layout中选择使用帮助方法?我只是对一般化的说法感到紧张,即某些事情是“可怕的想法”。 - Methodician
你可以让视图模型定义要显示的内容,并在控制器(或控制器使用的类)中处理所有角色逻辑并适当地分配视图模型。直接检查它仍然有效,但在更大的项目中将难以维护,并且对于视图来说会更加混乱。 - CRice
1
根据您的情况,您可以判断是否值得进行调用。 - CRice
我和@Methodician处于同样的境地,但似乎找不到任何合适的替代品。 - Sinjai

-1
我同意大多数人的看法,即这些数据应该由控制器或其他业务服务“预先确定”,而视图只需尽可能使用HTML标记和语言控制结构来使用其他常见的Web页面生成工具(如jquery、css等)“填充页面”。

1
我不太理解你的陈述,能否重新表述一下? - Shawn Mclean
他的意思是视图除了显示内容之外,不应该有任何高级逻辑。所有主要的逻辑(业务流程、数据管理和访问权限如此描述)都应该由控制器执行,并将结果存储在某个地方供视图使用。 - Christophe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接