2013-03-14 45 views
2

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

目前,我为每个属性在我的视图模型中传递一个枚举。然后我检查每个控件的枚举值。这导致了一个非常讨厌的剃刀块。即使使用@helper s,输出也非常糟糕。

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

回答

2

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

如果规则是依赖于如用户权限,并适用于所有的控件,然后我会说一个枚举每个viewmodel就足够了。

否则your're很好。我唯一会改变的是我会编写自定义扩展方法来显示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)

这将清洁您的剃须刀查看了一下。

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

+0

权。我在服务器端进行验证以确保只读字段未被修改。 – 2013-03-14 14:47:02

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