我需要将控件标记为只读,禁用它们或完全隐藏它们,具体取决于各种业务规则。
目前,我正在为我的视图模型中的每个属性传递一个枚举。然后我检查每个控件的枚举值。这导致了相当讨厌的 Razor 块。即使使用@helper
s 输出也很讨厌。
我想知道是否有更好的方法来根据业务规则更改控件的外观。大多数时候,我只是添加属性。在最坏的情况下,我根本没有显示控件。
我需要将控件标记为只读,禁用它们或完全隐藏它们,具体取决于各种业务规则。
目前,我正在为我的视图模型中的每个属性传递一个枚举。然后我检查每个控件的枚举值。这导致了相当讨厌的 Razor 块。即使使用@helper
s 输出也很讨厌。
我想知道是否有更好的方法来根据业务规则更改控件的外观。大多数时候,我只是添加属性。在最坏的情况下,我根本没有显示控件。
显示逻辑/责任落在了视图的肩上,所以......
如果规则依赖于例如用户权限并且适用于所有控件,那么我会说每个视图模型一个枚举就足够了。
否则你做得很好。我唯一要改变的是我会编写自定义扩展方法来显示视图模型属性。
这些方面的东西:
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 操作中需要注意的事情。
为此,您可以使用 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/