4

除了只允许某些角色访问某些控制器或动作之外,我还想根据角色提供稍微不同的 HTML。

例如,管理员可以看到编辑按钮,同时对于其他用户,此编辑按钮将不存在。它可能比这更复杂,例如某些角色可以编辑但不能删除..等等。

MVC 4 中是否有框架可以做到这一点?

这里的问题似乎很有趣,ASP.NET MVC Alternative Rendering EditorFor Based on User Role

但我不确定这是否是正确的方法。

4

3 回答 3

6

对于菜单,请考虑使用MVCSiteMapProvider,与其他 SiteMapProvider 一样,它可以配置为使用“安全修剪”,即仅显示当前用户有权使用的节点。即站点地图可用于生成菜单,该菜单将自动尊重Authorize控制器和操作的属性。

对于控件的可见性(编辑按钮、删除按钮等),将布尔属性添加到您的 Model:CanEditCanDelete,并让您的控制器根据用户的角色(User.IsInRole)填充它们。

关注点分离表明您不应直接在视图中访问角色。

于 2013-10-05T06:32:31.380 回答
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)

然后在您拥有的任何特定视图中;只有当页面需要它时,您才能获得对该部分中包含的基本视图的布局引用,因为它仅适用于管理员。然后用户的版本将没有该部分。这有助于将代码重复/编辑保持在较低或更少。

于 2013-10-05T06:19:02.637 回答
0

您指出的解决方案让我印象深刻。一种更简单(但可能更难维护)的方法是将用户角色的列表传递给视图(作为模型的属性)。然后,在视图中,您将在显示按钮的 HTML 周围有一个 if 语句,检查是否应向用户显示该按钮。

于 2013-10-05T06:10:51.260 回答