2010-04-27 27 views
5

我有一個視圖來顯示項目列表。 用戶可以編輯,刪除或創建新項目,但根據他們的授權,他們可能會或可能不會被允許執行某些操作。如何在mvc中保留視圖中的授權邏輯?

我,只顯示當前用戶被允許執行的操作的要求,但我不想與授權雜亂的意見的if-else的

的是一個非常普遍的需求鄙視,我找不到一個真正令人滿意的做法。

到目前爲止,我的最佳做法是爲需要請求權限的Html.ActionLink擴展方法提供重載,但會出現更復雜的方案,如隱藏整個html塊或切換標籤的文本框+隱藏。

有沒有更好的方法來做到這一點?

回答

2

我能想到的一個例子是調用Html.RenderAction(鏈接:http://msdn.microsoft.com/en-us/library/ee703490.aspx),然後將您希望用作路徑值的鏈接傳遞給動作方法(它將作爲參數顯示在動作中)。因爲它是一個RenderAction,所以你可以回到控制器進程,因此你可以根據用戶的狀態來渲染你想要的任何視圖或數據。

例子:

<% Html.RenderAction("Permissions" /* Controller */, "PermissionLink", new { Url = "Admin.aspx" }); %> 

而且您的控制器會碰到這樣的:

public ActionResult PermissionsLink (string url) 
{ 
    // Do Whatever kind of Authentication you want here, Session is available, etc 

    if(authenticated) 
     return View("Link"); 
    else 
     return View("Blank"); 
} 
+0

這是一個更好的方式來做什麼krisg建議他的答案,但它仍然在組件級別(krisg是在視圖級別)。也許我沒有足夠的瘋狂去做一個「RowAction」組件,並在每一行都調用它來呈現用戶能夠完成的動作,但是我最終可能會實現一個複選框方法,只有一個工具欄可以對這些項目執行操作。我花了一段時間,但我知道了。 TNKS。 – 2010-06-15 18:38:57

0

我們有同樣的問題。我們最終編寫了大量的輔助方法,並且在需要很多html輸出的情況下,我們將它們放在部分視圖中。

0

這豈不是更簡單的創建基於什麼值,用戶可以更改各種控制多個視圖,然後根據用戶的訪問權限返回正確的視圖?

視圖應該僅用於呈現信息,其中不應該包含任何條件邏輯,或者至少是最低限度。

我總是發現,當我發現很難跟你一樣的情況發生時,最好的解決方案總是回到控制器並通過電子評估我傳遞給首先是觀點。

當視圖被調用來完成它的工作時,所有重要的'決定'應該已經被創建。

+2

我明白你的意思,但是對每一個決定的看法都不實際。就我的例子而言,上面會有7個視圖(每個組合有一個視圖)。現在想想一個具有很多訪問限制功能的商業應用程序,以獲得高度詳細的信息。有時候,組合是最好的方法,但即使如此,組件級別仍有待做出決定。 – 2010-05-24 14:48:38

+0

在這樣做時,我爲我的processshippment操作計數了34個視圖。這不是一個好方法。 :/ – dariol 2011-03-14 11:27:08

0

在有很多的條件和規則,我這樣做是這樣複雜的情況:

視圖模型

public class ModelView 
{ 
    private IAuthorisationService { get; set; } 

    public bool CanShow 
    { 
     ... 
    } 
} 

查看:

<% if(Model.CanShow) { %> 
    <html> 
<% } %> 
+0

這是我不想做的事情:把if語句視爲授權。這仍然比在ViewMessage上加載權限或其他東西好,然後查詢它。 – 2011-03-14 18:52:58

0

我個人看不出什麼錯在視圖內使用這種條件邏輯。邏輯仍然是關於演示。您決定是否顯示或隱藏,啓用或禁用,突出顯示等。這是視圖的工作,而不是控制器的工作。只要這個觀點不需要真正計算任何事情來做出決定。控制器應該與其他方式不同,視圖的實現是不可知的。

我的做法是這樣的:

  • 使控制器做決定的訪問級別用戶具有的實際邏輯
  • 傳遞(通過視圖模型,即)使用該信息的看法,但以對實現細節保持中立的方式(即「用戶是管理員」,「用戶是作者」等)
  • 讓視圖僅使用控制器提供的預編譯數據自行繪製自己。

這也有一個好處,視圖本身可以刪除和替換沒有任何影響控制器。