我们知道授权的内容是一个跨领域的问题,我们会尽一切努力避免在我们的 View 中合并业务逻辑。
但我仍然没有找到一种优雅的方法来使用当前用户角色过滤 UI 组件(例如小部件、表单元素、表格等),而不用业务逻辑污染 View 。这同样适用于模型绑定(bind)。
示例
表单:产品创建
字段:
- 姓名
- 价格
- 折扣
角色:
角色管理员
- 允许查看和修改“名称”字段
- 允许查看和修改价格字段
- 可以查看和修改折扣
角色管理员助理
- 可以查看和修改姓名
- 可以查看和修改价格
每个角色中显示的字段
不同,并且模型绑定(bind)
需要忽略“管理员助理”角色的折扣字段
。
你会怎么做?
最佳答案
我认为要做到这一点的方法是创建您自己的 input extension methods 版本。例如,您可以创建 TextBoxRoles
并按如下方式定义它,而不是 TextBox
:
public static MvcHtmlString TextBoxRoles(
this HtmlHelper htmlHelper,
string name,
string RolesEdit,
string RolesView
)
然后在代码中它看起来像这样:
<%= Html.TextBoxRoles("Price", "Administrator","Administrator,Assistant") %>
然后,您的 TextBoxRoles
实现将通过 User.IsInRole()
检查当前用户的角色,以确定页面上应显示的内容。
当然,您必须为您使用的每个输入扩展方法执行此操作。
关于ASP.Net MVC优雅的UI和ModelBinder授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2738390/