2

我们知道授权的东西是一个横切关注点,我们尽我们所能避免在我们的视图中合并业务逻辑。ASP.Net MVC优雅的UI和ModelBinder授权

但我仍然没有找到一种优雅的方式来过滤使用当前用户角色的UI组件(例如小部件,表单元素,表等),而不会污染具有业务逻辑的视图。同样适用于模型绑定。


表:产品创新

领域:

  • 名称
  • 价格
  • 折扣

角色:

  • 角色管理员

    • 被允许查看和修改名称字段
    • 被允许查看和修改价格字段
    • 被允许查看和修改th Ë折扣
  • 角色管理员助理

    • 被允许查看和修改名称
    • 被允许查看和修改价格

Fields每个角色所显示的都是不同的,也是01 “”需要忽略“管理员助理”角色discount field

你会怎么做?

+0

你使用EditorFor()为你的屏幕? – jfar 2010-04-29 16:06:46

+0

还没有。我正在使用MVC 1(迁移计划;)为什么? – SDReyes 2010-04-29 16:17:01

+2

因为使用模板助手和模型元素更容易。 – jfar 2010-04-29 17:38:41

回答

1

由于您已经拥有当前用户和访问控制器中的授权提供者,因此这是他们的理想职责。在过滤了当前用户有权访问的小部件之后,使用一个天真的实现,可以将一组小部件传递给您的视图。在您的表单字段的情况下,当您考虑客户端验证时,事情可能会变得多毛。

结合部将所有的最直接的,有针对这些特殊情况下会做的伎俩定制粘合剂特别好,因为它不会访问控制器上下文,你可以从那里绑定抓住当前用户根据您的角色定义的值。

+0

嗨,何塞,在MVC上下文中,我同意你在控制器上放置'UI'和'ModelBinding'逻辑。 (他们可以访问我们需要的所有组件,除了这些情况下已经存在定制的ModelBinder)。好的方法+1 – SDReyes 2010-04-29 23:47:58

3

在途中,我可以这样做是创建您自己的版本input extension methods。例如,而不是TextBox您可以创建TextBoxRoles并定义它像这样:

public static MvcHtmlString TextBoxRoles(
    this HtmlHelper htmlHelper, 
    string name, 
    string RolesEdit, 
    string RolesView 
) 

然后在代码中它是这样的:

<%= Html.TextBoxRoles("Price", "Administrator","Administrator,Assistant") %> 

那么你的TextBoxRoles实施将检查当前的角色用户通过User.IsInRole()确定页面上应显示的内容。

当然,您必须为您使用的每种输入扩展方法执行此操作。

+0

嗨Keltex,Good workaroud +1 !,尽管如此,使用这种方法,您仍然必须在视图中定义授权角色:|。我想知道我们是否可以将所有这些逻辑转移到其他层。你怎么看? 再次感谢Keltex! :D – SDReyes 2010-04-29 15:25:39

1

LinFu,一个AOP框架呢?如果它是横切的,那么声明它是这样的,并将其视为如此。

+0

嗨斯科特,AOP看起来像一个非常好的方法+1,谢谢!你的意思是,像拦截从助手渲染方法,并添加授权逻辑? – SDReyes 2010-04-29 17:40:27