我们正在开发类似工作流程的应用程序。我们希望为不同的用户角色显示相同的表单(具有相同的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是:
<input class="form-control global" id="ServiceID" name="ServiceID" type="text" value="" readonly="readonly">
&#13;
如何创建继承ReadOnlyAttribute
或&#39; EditableAttribute&#39;的自定义属性,因为它们都是密封类?
要覆盖哪种方法?或者还有其他解决方案吗?
感谢。
答案 0 :(得分:2)
您误解了EditableAttribute
的用法它对html助手生成的html没有影响。它所做的就是设置IsReadOnly
的{{1}}属性。你当然可以使用像
ModelMetaData
但这不是预期用途。
一些选项包括
@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 readonly
属性。 this answer ViewBag
并实现Attribute
然后创建
你自己的html助手,读取属性属性并添加
html属性。 this
answer