基于ASP.NET MVC中不同角色的条件ReadOnly / Editable属性

时间:2015-01-27 05:35:28

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我们正在开发类似工作流程的应用程序。我们希望为不同的用户角色显示相同的表单(具有相同的ViewModel和相同的View)。我们希望根据特定的用户角色制作一些ReadOnly Not Editable字段。

ViewModel就像:

public class ServiceViewModel
{
    [EditableIfInRoles("Administrator", "Editor")]
    public string ServiceId { get; set; }
}

我们计划创建一个自定义ReadOnlyAttribute,例如:

public class EditableIfInRolesAttribute : EditableAttribute
{
    private IEnumerable<string> _allowedRoles; 

    public EditableIfInRolesAttribute(params string[] allowedRoles) : base(true)
    {
        _allowedRoles = allowedRoles;
    }

    /// <summary>
    /// Currently we don't know which method to override
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public override bool IsEditable(object value)
    {
        return _allowedRoles.Any(e => HttpContext.Current.User.IsInRole(e));
    }
}

我们期望未经授权的用户角色呈现的HTML是:

&#13;
&#13;
<input class="form-control global" id="ServiceID" name="ServiceID" type="text" value="" readonly="readonly">
&#13;
&#13;
&#13;

如何创建继承ReadOnlyAttribute或&#39; EditableAttribute&#39;的自定义属性,因为它们都是密封类?

要覆盖哪种方法?或者还有其他解决方案吗?

感谢。

1 个答案:

答案 0 :(得分:2)

您误解了EditableAttribute的用法它对html助手生成的html没有影响。它所做的就是设置IsReadOnly的{​​{1}}属性。你当然可以使用像

这样的东西读取值
ModelMetaData

但这不是预期用途。

一些选项包括

  1. 设置视图模型或@if (ViewData.ModelMetadata.Properties.Where(p => p.PropertyName == "SomeProperty").First().IsReadOnly) { // add the readonly="readonly" attribute to the control 属性(例如ViewBag) 然后根据值添加html bool isReadOnly属性。 this answer
  2. 中显示了此方法的一个示例
  3. 创建您自己的接受视图模型的html帮助器或readonly 属性。 this answer
  4. 中显示了此方法的一个示例
  5. 如果要使用DataAnnotations,请创建自己的属性 继承ViewBag并实现Attribute然后创建 你自己的html助手,读取属性属性并添加 html属性。 this answer
  6. 中显示了此方法的一个示例