2

我需要将控件标记为只读,禁用它们或完全隐藏它们,具体取决于各种业务规则。

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

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

4

2 回答 2

2

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

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

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

这些方面的东西:

    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 => x.Prop, Model.PropMode)

这会清理你的剃刀视图。

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

于 2013-03-14T14:32:19.823 回答
0

为此,您可以使用 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

于 2013-03-15T15:19:20.837 回答