2012-02-22 133 views
4

想象一下,您擁有一個安全站點和一個可以以多種方式生成的視圖,具體取決於用戶角色。例如,管理員可以看到所有內容,管理員可以看到一些列和一些操作按鈕,用戶可以看到其他列和其他操作按鈕。ASP.NET MVC3查看授權設計

你將如何實現這一點?至於我看來,主要有三個選項:

  • 控制器,[授權]屬性,並返回每個用戶角色1所查看的動作,是量身定做的角色的看法;
  • 具有[Authorize]屬性的控制器和返回1的操作View用於所有角色,具有隱藏/顯示列,字段,按鈕的邏輯;
  • 具有[Authorize]屬性的控制器以及返回1 View的操作,該操作基於角色呈現不同的Partial Views。

我更喜歡第三種方法,但是您看到更好的實現方法嗎?

預先感謝您

回答

2

取決於你的觀點的複雜性,無論是第一個或第三個選項對我來說似乎沒問題。至於第二種選擇;它通常建議避免在視圖中的邏輯,所以我會遠離那一個。

如果你選擇第三個選項,你應該考慮使用EditorTemplates和DisplayTemplates。這將允許您使(主)視圖不知道要渲染哪個局部視圖。 使您的viewmodel(或它的一部分)從一個基類繼承。爲每個視圖模型類型創建顯示和/或編輯器模板,並在您的視圖中只需說Html.DisplayFor(...)Html.EditorFor(...)。 MVC將自動選擇合適的模板,而不需要在視圖中使用邏輯。

+0

我喜歡你的方法,使視圖不知道部分渲染。我將看看DisplayFor幫助程序的功能。謝謝! – Dante 2012-02-22 13:17:53

+0

儘管我不打算實施此解決方案,但我確實認爲這是解決問題的最佳方法。現在,我將採用更簡單的解決方案,如果管理視圖的複雜性增加,我會重構此解決方案。乾杯! – Dante 2012-02-22 14:11:14

0

我一直在做菜單和其他導航項目的是,我有這方面的ViewModel類。這是一個簡化版本。

視圖模型

public class Action 
{ 
    public string DisplayName { get; set; } // localized 
    public string Url { get; set; 
} 

public class MenuViewModel 
{ 
    public List<Action> Actions { get; set; } 

    public MenuViewModel() 
    { 
     this.Actions = new List<Action>(); 
    } 
} 

我填補根據用戶的角色。聯繫變得更加鏈接等

這是視圖模型「主」視圖模型

public class AlbumEditorViewModel 
{ 
    public MenuViewModel Menu { get; set; } 
} 

的一部分,那麼我會通過該負責菜單中的部分觀點,即視圖模型。

視圖(剃刀)

@model AlbumEditorViewModel 

.. razor stuff here .. 
@Html.Partial("Menu", Model.Navigation) 
.. razor stuff here .. 

管窺

@model MenuViewModel 

<ul> 
    @foreach (var action in Model.Actions) 
    { 
     <li> 
      @GridHelper.GetAction(action) 
     </li> 
    } 
</ul> 

我希望這會給你的想法

+0

我也有這個地方,但如果你的部分包含一個表,列,按鈕,一些領域,他們應該顯示或不取決於用戶角色? – Dante 2012-02-22 13:02:55

+0

一個解決方案是創建包含非常簡單的邏輯的聲明助手:顯示或不顯示 – Tx3 2012-02-22 13:08:25