我可以根据条件显示/隐藏带有数据注释的视图模型元素吗?

时间:2012-08-30 09:06:51

标签: asp.net-mvc asp.net-mvc-3 model-view-controller data-annotations

我使用数据注释和一些自定义模板生成了大量视图。

public class Container
{
    [HiddenInput(DisplayValue = false)]
    public string Key { get; set; }

    [Display(Name = "Full Name")]
    [RequiredForRole("Editor"), StringLength(30)]
    public string Name { get; set; }

    [Display(Name = "Short Name")]
    [RequiredForRole("Editor"), StringLength(10)]      
    public string ShortName { get; set; }

    [Display(Name="Maximum Elements Allowed")]
    [RequiredForRole("Admin")]
    public int MaxSize { get; set; }

    [Display(Name = "Components")]
    public IList<Component> Components{ get; set; }
}

在视图中,我只使用@Html.DisplayForModel()@Html.EditorForModel

某些属性需要由某些角色的用户编辑,但对其他角色则是隐藏的。正如您所看到的,我已经实现了一个自定义验证属性RequiredForRole,该属性检查存在的值,但前提是当前用户具有某个角色。

我真的需要一个自定义的Display属性,但是当DisplayAttribute被密封时,这似乎不可能。

我想避免为不同类型的用户提供许多不同的模板,或者开始推动谁能看到视图中的内容。什么是解决这个问题的最佳方法?

1 个答案:

答案 0 :(得分:3)

也许这样的事情。 (BIG)问题是:如何检查当前用户的角色......

public class VisibleForRoleAttribute : Attribute, IMetadataAware
    {
        public string[]  Roles { get; set; }
        public VisibleForUserAttribute(string[] roles)
        {
            Roles = roles;
        }
        public void OnMetadataCreated(ModelMetadata metadata)
        {
            var toShow =  Roles.Any(IsUserInRole);
            metadata.ShowForDisplay = metadata.ShowForEdit =  toShow; // or just ShowForEdit

        }
        private bool IsUserInRole(string roleName)
        {
            return HttpContext.Current != null &&
                   HttpContext.Current.User != null &&
                   HttpContext.Current.User.IsInRole(roleName); //if you use MembershipProvider
        }
    }

使用

[VisibleForRole(new[]{"Administrator", "Editor"})]