2011-04-26 62 views
1

我有一个模型类,它具有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()来自动支架视图时如何限制对特定属性的访问?

我需要建立完全独立的观点和看法模型或有更简单的方法吗?

回答

1

这里是我结束了去了解决方案:

  1. 使用视图模型,而不是模型。所以,在这种情况下,我创建了一个名为ViewModels.ClubMember.EditorModel的类。
  2. 对于任何属于管理员的属性,请将它们放在单独的类中。在这种情况下,ViewModels.ClubMember.AdminEditorModel
  3. AdminEditorModelEditorModel的属性。
  4. 当请求EditorModel,即获得该模型的服务检查登录用户的凭据。如果用户是管理员,则填充AdminEditorModel属性,否则将其设置为空。
  5. 在视图中,使用EditorForModel()来渲染EditorModel,然后,如果AdminEditorModel不为空,请使用EditorFor(model => model.AdminEditorModel)来支撑剩余的属性。 (注:AdminEditorModel不会自动做脚手架时EditorForModel()因为默认object模板专门忽略复杂性。)

这花了一些工作来实现,但到目前为止,我发现这是一个相当干净解。它似乎也与验证一起工作得很好。

更新基于一些对衰退的答案评论

(尤其是丹尼的),我决定肯定东西多一点通过使用管理员与普通用户完全不同的页面。每个页面都有自己的视图模型(EditorModelAdminEditorModel)。这需要更多的工作,然后我的初始解决方案(我不得不添加新的动作到我的控制器,并添加视图模型和模型之间的映射,但最终的结果是另一个层次更清洁,并且绝对更安全

1

它dosent,应使房产权限限制。相反,您应检查呈现视图时是否已登录的用户具有“管理员”角色(在视图中组成一些if语句,因此如果用户在角色“管理员”中,则显示AreDuesPaid的值,否则隐藏)

+0

但我认为这使得它不可能使用'DisplayForModel()'和'EditorForModel()'。 – devuxer 2011-04-26 20:24:20

+1

我还必须非常小心在视图中隐藏的东西,因为恶意用户可能仍然张贴从“保护”性能数据并将它们写入您的课程在保存之前。权限不属于UI代码。 – 2011-04-28 15:34:27

+0

@丹尼,你得详细解释一下。 HttpPost的'ActionResult'通常用'[Authorize]'属性修饰,或者是一个自定义的属性,它允许你指定哪些角色应该被允许调用'ActionResult'。 – ebb 2011-05-03 18:22:22

相关问题