我有一个具有AreDuesPaid
属性的模型类,我只希望管理员能够查看和编辑。
该课程看起来像这样:
public class ClubMember
{
[ScaffoldColumn(false)]
public int Id { get; set; }
[Display(Name = "First Name")]
[Required(ErrorMessage = "First name is required")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
[Required(ErrorMessage = "Last name is required")]
public string LastName { get; set; }
[Display(Name = "Email Address")]
[DataType(DataType.EmailAddress)]
public string EmailAddress { get; set; }
[DataType(DataType.PhoneNumber)]
[Display(Name = "Phone Number")]
public string PhoneNumber { get; set; }
[Authorize(Roles="Administrator")] // error: this can only be used for methods
public bool AreDuesPaid{ get; set; }
}
我想也许我可以使用Authorize
属性,但编译器告诉我这只适用于方法。
所以,我想知道,在使用DisplayForModel()
和EditorForModel()
自动搭建视图时,如何限制对特定媒体资源的访问?
我是否需要创建完全独立的视图和视图模型,还是有更简单的方法?
答案 0 :(得分:1)
对属性进行权限限制是有意义的。相反,您应该在渲染视图时检查登录的用户是否处于“管理员”角色(在视图中组成一些if语句,因此如果用户处于角色“Administrator”,则显示AreDuesPaid的值,别隐藏它)
答案 1 :(得分:1)
以下是我最终选择的解决方案:
ViewModels.ClubMember.EditorModel
。ViewModels.ClubMember.AdminEditorModel
AdminEditorModel
。EditorModel
个媒体资源
EditorModel
时,获取模型的服务会检查登录用户的凭据。如果用户是管理员,则填充AdminEditorModel
属性,否则将其设置为null。EditorForModel()
呈现EditorModel
,然后,如果AdminEditorModel
不为null,请使用EditorFor(model => model.AdminEditorModel)来构建剩余的AdminEditorModel
属性。 (注意:执行EditorForModel()
时,object
不会自动搭建,因为默认的EditorModel
模板会特别忽略复杂的属性。)这需要一些工作来实现,但到目前为止,我发现它是一个相当干净的解决方案。它似乎也适用于验证。
<强>更新强>
基于对ebb答案的一些评论(特别是Danny's),我决定通过为管理员和普通用户使用完全独立的页面来确保更多。每个页面都有自己的视图模型(AdminEditorModel
和{{1}})。这比我的初始解决方案需要更多的工作(我必须向我的控制器添加新操作并在视图模型和模型之间添加映射,但最终结果是另一个级别更清晰且更加安全。