ASP.NET MVC 4如何根据角色提供不同的HTML?

5
除了允许特定角色访问特定控制器或操作外,我希望根据角色提供略有不同的HTML。例如,管理员可以看到编辑按钮,而其他用户则看不到。这可能比较复杂,例如某些角色可以编辑但不能删除等。
MVC 4中是否有框架可以实现此功能?
这里的问题似乎很有趣,参见:ASP.NET MVC Alternatively Rendering EditorFor Based on User Role,但我不确定这是否是正确的方法。
3个回答

6
考虑使用MVCSiteMapProvider来创建菜单,与其他SiteMapProviders类似,可以配置使用“安全修剪”,即仅显示当前用户被授权使用的节点。也就是说,一个网站地图可以用于生成菜单,该菜单将自动遵守控制器和操作上的Authorize属性。
为了实现对控件(编辑按钮、删除按钮等)的可见性,向您的模型添加布尔属性:例如CanEditCanDelete,并让您的控制器根据用户的角色(User.IsInRole)填充它们。
关注点分离原则要求您不应直接在视图中访问角色。

你提到的关注点分离是正确的方式!感谢提供 MVCSiteMapProvider 的链接。 - Moiz Tankiwala

2

如果视图非常相似,我通常会创建一个包含所有角色都可以看到的基本详细信息的视图。然后,我通常为每个角色添加一些部分视图。

 @Html.Partial("_AdminToolbar")
 @Html.Partial("_UserToolbar")

这些局部视图有一个简单的 <\p>。
@if ( User.IsInRole("Admin") ) 

仅显示与角色相关的部分。如果该部分将在多个地方重复使用,则此方法效果最佳,可以使视图更易于阅读,避免重复编写几乎相同的视图代码。

您始终可以在视图中使用User.InRole或!User.InRole来包装要显示或不显示的位。

还有一点值得注意,在更复杂的情况下,最终HTML放置在网页中的位置并不总是其呈现到内容中的位置。可以使用CSS将内容定位到所需位置,并将整个管理内容注入到一个部分或一个User.InRole块内。

您还可以使用共享基础视图,然后使用RenderSection在不同的部分周围放置多个标记。

@RenderSection("AdminSection", required: false)

在任何特定的视图中,如果页面要求仅供管理员使用,则可以在该部分中包含基本视图的布局引用。然后用户版本将不会有该部分。这有助于减少代码重复/编辑的次数。请保留HTML标记。

0
您所指向的解决方案给我留下了非常好的印象。一种更简单(但也许更难维护)的方法是将用户角色列表作为模型属性传递到视图中。在视图中,您可以使用if语句来判断是否应向用户显示按钮,并在HTML中显示该按钮。

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