除非用户角色是管理员,否则阻止属性自动搭建?

时间:2011-04-26 17:28:55

标签: asp.net-mvc asp.net-mvc-3 asp.net-membership

我有一个具有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()自动搭建视图时,如何限制对特定媒体资源的访问?

我是否需要创建完全独立的视图和视图模型,还是有更简单的方法?

2 个答案:

答案 0 :(得分:1)

对属性进行权限限制是有意义的。相反,您应该在渲染视图时检查登录的用户是否处于“管理员”角色(在视图中组成一些if语句,因此如果用户处于角色“Administrator”,则显示AreDuesPaid的值,别隐藏它)

答案 1 :(得分:1)

以下是我最终选择的解决方案:

  1. 使用视图模型而不是模型。所以,在这种情况下,我创建了一个名为ViewModels.ClubMember.EditorModel
  2. 的类
  3. 对于任何仅限管理员的属性,请将它们放在单独的类中。在这种情况下,ViewModels.ClubMember.AdminEditorModel
  4. AdminEditorModel
  5. 上设置EditorModel个媒体资源
  6. 请求EditorModel时,获取模型的服务会检查登录用户的凭据。如果用户是管理员,则填充AdminEditorModel属性,否则将其设置为null。
  7. 在视图中,使用EditorForModel()呈现EditorModel,然后,如果AdminEditorModel不为null,请使用EditorFor(model => model.AdminEditorModel)来构建剩余的AdminEditorModel属性。 (注意:执行EditorForModel()时,object不会自动搭建,因为默认的EditorModel模板会特别忽略复杂的属性。)
  8. 这需要一些工作来实现,但到目前为止,我发现它是一个相当干净的解决方案。它似乎也适用于验证。

    <强>更新

    基于对ebb答案的一些评论(特别是Danny's),我决定通过为管理员和普通用户使用完全独立的页面来确保更多。每个页面都有自己的视图模型(AdminEditorModel和{{1}})。这比我的初始解决方案需要更多的工作(我必须向我的控制器添加新操作并在视图模型和模型之间添加映射,但最终结果是另一个级别更清晰且更加安全。