【问题标题】:ASP.NET MVC Disable/Hide Controls Based on Business RulesASP.NET MVC 根据业务规则禁用/隐藏控件
【发布时间】:2013-03-02 22:47:05
【问题描述】:

我需要根据各种业务规则将控件标记为只读、禁用或完全隐藏它们。

目前,我正在为我的视图模型中的每个属性传递一个枚举。然后我检查每个控件的枚举值。这导致了相当讨厌的 Razor。即使使用@helpers,输出也很糟糕。

我想知道是否有更好的方法来根据业务规则更改控件的外观。大多数时候,我只是添加属性。在最坏的情况下,我根本没有显示控件。

【问题讨论】:

    标签: asp.net-mvc user-permissions disabled-control


    【解决方案1】:

    显示逻辑/责任落在视图的肩上,所以...

    如果规则依赖于例如用户权限并且适用于所有控件然后我会说每个视图模型一个枚举就足够了。

    否则你做的很好。我唯一要改变的是我会编写自定义扩展方法来显示视图模型属性。

    类似的东西:

        public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, DisplayMode mode)
        {
         // put a switch statement here to either
         // add html attribute for readonly
         // or
         // return null/emptystring
        }
    

    有了这个扩展,你的视图可以有@Html.TextBoxFor(x =&gt; x.Prop, Model.PropMode)

    这会稍微清理你的剃刀视图。

    还请记住,只读字段值仍然可以更改(开发工具、萤火虫)。这是您的 HttpPost 操作中需要注意的事情。

    【讨论】:

    • 对。我在服务器端进行验证以确保只读字段未被修改。
    【解决方案2】:

    为此,您可以使用 XACML(可扩展访问控制标记语言 - 基于属性的访问控制实现)和策略决策点。有了它,您实际上可以将控件/小部件可见性/启用状态绑定到决策,例如

    approveButton.Enabled = PDPUtil.authorized(Page.User.Identity.Name, purchaseOrderObject);
    

    政策是在您的应用之外定义的,可以根据您的喜好进行细化,例如

    Managers can approve a purchase order if the poLocation == userLocation.
    

    然后可以将策略应用于不同的系统,而不仅仅是 .NET 控件。相同的策略可以应用于 HttpModule 或 WCF 消息检查器。

    我在这里写了一篇关于 XACML 和 C# 的文章:http://www.webfarmr.eu/2012/02/fine-grained-access-control-using-xacml-in-c-applications-and-the-net-framework/

    也可以查看http://www.axiomatics.com/policy-decision-points.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多