除了允许某些角色访问某些Controller或Action之外,我还希望根据角色提供略有不同的HTML。
管理员可以看到编辑按钮,例如,对于其他用户,此编辑按钮不会出现。它可能比这更复杂,例如某些角色可以编辑但不能删除..等等。
MVC 4中是否有框架来执行此操作?
这里的问题似乎很有意思,ASP.NET MVC Alternatively Rendering EditorFor Based on User Role
但我不确定这是否是正确的方法。
答案 0 :(得分:6)
对于菜单,请考虑使用MVCSiteMapProvider,与其他SiteMapProviders一样,可以配置为使用“安全修整”,即仅显示当前用户有权使用的节点。即站点地图可用于生成一个菜单,该菜单将自动遵守控制器和操作的Authorize
属性。
对于控件的可见性(编辑按钮,删除按钮等),将布尔属性添加到模型:CanEdit
,CanDelete
等,并让控制器根据用户的角色填充它们( User.IsInRole)。
关注点分离表明您不应直接在视图中访问角色。
答案 1 :(得分:2)
如果视图非常类似于我通常通过创建一个具有所有角色可以看到的基本细节的视图来处理它。然后,我通常会为每个角色添加一些Partials
@Html.Partial("_AdminToolbar")
@Html.Partial("_UserToolbar")
这些部分有一个简单的
@if ( User.IsInRole("Admin") )
仅显示角色的部分内容。如果部分将在许多地方重复使用并使视图更容易阅读,并且您不必重复使用几乎相同的视图的代码,那么这种方法效果最佳。
您始终可以在视图中使用User.InRole或!User.InRole来包装要显示或不显示的位。
记住,在更复杂的情况下,最终HTML放置在网页中的位置并不总是将其呈现到内容中的位置,这也很有帮助。 CSS可用于将内容定位在欲望位置,管理员的整个内容可以在一个部分或一个User.InRole块中注入输出。
您还可以使用共享基本视图,然后使用RenderSection在不同的部分周围放置一些标记
@RenderSection("AdminSection", required: false)
然后在你的任何具体观点中;只有当页面需要时,您才能拥有该部分中包含的基本视图的布局参考,因为它仅适用于管理员。然后用户的版本将没有该部分。这有助于保持代码重复/编辑的低或更低。
答案 2 :(得分:0)
你指出的解决方案让我感觉非常好。一种更简单(但可能更难维护)的方法是将用户角色的列表传递给视图(作为模型的属性)。在视图中,您将在HTML周围显示一个if语句,显示按钮,检查是否应该向用户显示该按钮。