2009-06-27 35 views
1

我正在ASP.NET MVC中開發一個網站,我想爲具有不同安全級別的用戶顯示不同部分的視圖。本質上,視圖是相同的,但具有較高安全級別的用戶必須能夠看到安全級別高於管理員的用戶不應看到的部分。如何以面向對象的方式顯示不同的視圖部分

我不知道如何以面向對象的方式做到這一點。我認爲這可以通過繼承完成,但我不知道如何在視圖中實現繼承。

而且,我知道我可以編寫一個地段IFS的,做這樣的事情

<% if (User has some security level) { %> 
    <span>show this info</span> 
<% } %> 

但這不聞好。事實是,我不知道如何使用面向對象的原則或設計來完成這項任務。

我認爲這是一個常見的任務,所以我認爲有一種模式可以完成這項任務。例如,當爲發佈問題(或回答或評論)的用戶顯示某些選項(編輯,刪除等)並將相同的選項隱藏給其他人時,Stackoverflow會執行此操作。

回答

0

根據你在做什麼的複雜性,if語句路由可能就足夠了。如果不是,那麼你可以看看使用部分視圖並編寫一個HtmlHelper擴展,它允許你根據特定角色渲染一個部分。它可能是這個樣子:

<% Html.RenderPartialWithRole("AdminSection", 
           Model, 
           ViewData, 
           User, 
           "Administrator", 
           null) %> 


public static void RenderPartialWithRole(this HtmlHelper helper, 
              string partialName, 
              object model, 
              ViewDataDictionary viewData, 
              IPrincipal user, 
              string role, 
              object htmlAttributes) 
{ 
    if (user != null && !string.IsNullOrEmpty(role) && user.IsInRole(role)) 
    { 
      helper.RenderPartial(partialName, model, viewData, htmlAttributes); 
    } 
} 
0

使用強類型的視圖,對你的模型像ShowSection(每個部分,邏輯在controllor設置)布爾屬性。使用帶有良好Id的div標籤。然後使用JavaScript或jquery根據布爾屬性設置div標籤顯示樣式。

+0

這不是面向對象的,並且如果用戶已禁用JavaScript javascript不起作用 – eKek0 2009-06-27 15:19:41

0

您可以將部分中的所有部分與視圖構建爲包含可用於不同權限級別的部分。所以一個管理員,每個級別一個。然後你的控制器有邏輯決定使用哪個視圖。所以任何OO部分都在控制器中,而不是視圖中。

0

這不是一個面向對象的方法,但它是相關的。這個問題的有趣部分是如何獲取if語句。擺脫if或case的常用方法是使用標準和效果查找表。還有其他技術使用這種相同的想法,例如數據定向編程(http://en.wikipedia.org/wiki/Data-directed___programming)和調度表(http://en.wikipedia.org/wiki/Dispatch_table)。許多語言實現使用類型調度表來實現虛擬方法調用。

假設部分視圖可以解決這個問題,查找表可以是一個對列表。該對中的第一個元素是一個角色名稱,用於檢查當前用戶。該對中的第二個元素是在角色檢查成功時呈現的部分視圖的名稱。

我們初始化該表中,所述控制器(或徘徊無論)並將其分配到的ViewData,然後使用Html.RenderViewByRole選擇和呈現正確的局部視圖:

<% Html.RenderPartialByRole(User, (List<Dispatch>)ViewData["rolePartial"]); %> 

public static class MyHelper { 
    public static void RenderPartialByRole(this HtmlHelper helper, IPrincipal user, List<Dispatch> rolePartial) { 
     foreach (Dispatch d in rolePartial) { 
      if (d.CheckRole(user)) { 
       helper.RenderPartial(d.PartialName); 
       break; 
      } 
     } 
    } 
} 

public class Dispatch { 
    string _roleName; 
    string _partialName; 

    public Dispatch(string roleName, string partialName) { 
     _roleName = roleName; 
     _partialName = partialName; 
    } 
    public bool CheckRole(IPrincipal user) { 
     return user.IsInRole(_roleName); 
    } 
    public string PartialName { 
     get { return _partialName; } 
    } 
} 

public class HomeController : Controller { 

    List<Dispatch> rolePartial = new List<Dispatch>(); 
    private void InitTable() { 
     rolePartial.Add(new Dispatch("admin", "adminPartial")); 
     rolePartial.Add(new Dispatch("report", "reportPartial")); 
     rolePartial.Add(new Dispatch("guest", "guestPartial")); 
    } 

    public HomeController() { 
     InitTable(); 
    } 

    public ActionResult Index() { 
     ViewData["rolePartial"] = rolePartial; 
     return View(); 
    } 
} 
相關問題