我使用数据注释和一些自定义模板生成了大量视图。
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
被密封时,这似乎不可能。
我想避免为不同类型的用户提供许多不同的模板,或者开始推动谁能看到视图中的内容。什么是解决这个问题的最佳方法?
答案 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"})]