我需要将控件标记为只读,禁用它们或完全隐藏它们,具体取决于各种业务规则。
目前,我正在为视图模型中的每个属性传递一个枚举。然后我检查每个控件的枚举值。这导致了一个非常讨厌的Razor大块。即使使用@helper
s,输出也非常糟糕。
我想知道是否有更好的方法可以根据业务规则更改控件的外观。大多数时候,我只是添加属性。在最糟糕的情况下,我根本没有显示控件。
答案 0 :(得分:2)
显示逻辑/责任落在视野的肩膀上,所以......
如果规则取决于例如用户权限并适用于所有控件,然后我会说每个viewmodel一个枚举就足够了。
否则你就行了。我唯一要改变的是我会编写自定义扩展方法来显示viewmodel属性。
这些方面的东西:
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)
这样可以清理你的剃刀视图。
还要记住,readonly字段值仍然可以更改(dev工具,firebug)。这是你的HttpPost行动中需要注意的事情。
答案 1 :(得分: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/