无论使用何种语言或MVC框架,我应如何根据角色处理不同的视图?
例如(伪代码):
<% show post here %>
if (role.isAdmin or role.isModerator) {
<% show moderation tools %>
}
<% show rest of content %>
我不太喜欢在视图中添加太多业务逻辑的想法,但似乎没有其他选择。在那儿?
一旦您拥有更多角色或不同级别的权限,这会变得更加混乱和混乱。以此网站为例。拥有超过200个代表的用户会看到更少的广告。拥有超过500个代表的用户都有一个重复按钮。然后你会得到2000的编辑按钮,3000的关闭按钮,10k的审核工具,以及如果你是“明星”主持人的更多功能。
答案 0 :(得分:4)
通过使用名为ShowModerationTools
的布尔属性的自定义ViewModel,可以使其更加整洁。在您的控制器中,您执行检查以查看当前用户是否可以根据他们的角色查看帖子并将ShowModerationTools
设置为true
或false
。然后,将自定义ViewModel返回到视图。这样你就可以在你的视图中执行此操作:
<% show post here %>
if (Model.ShowModerationTools) {
<% show moderation tools %>
}
<% show rest of content %>
这也意味着如果您的业务规则发生变化(例如您需要引入另一个条件),您只需更改控制器,而无需更改视图。
答案 1 :(得分:3)
这没有错。这不是商业逻辑。这是演示逻辑。
这个if
答案的问题是:我们应该展示审核工具吗?
它不像:'普通用户应该能够删除整个付款历史'还是什么。
答案 2 :(得分:1)
我同意Arnis L. - 但会添加以下内容。
你可以这样做......
<% show post here %>
<% Html.RenderAction<MyControllerName>(m => m.ModerationTools()); %>
<% show rest of content %>
这有几个好处。
它在一个Action中封装了审核工具所需的模型和视图。
在您发布的页面中,您甚至可能无需在模型上扮演角色
可以在其他页面上重复使用。
答案 3 :(得分:0)
就我个人而言,我认为这里更重要的是善与善之间的区别......
虽然从技术上讲,我认为将其归类为业务逻辑,但对于这样一个简单的案例,我在视图中看不到包含它的问题。
现在,如果你有更复杂的逻辑,我建议为每个“逻辑分支”创建一个新视图,并在控制器中选择它们。