2013-02-26 148 views
0

我正在爲Html.RenderAction創建一個自定義的HtmlHelper擴展。我的父視圖將包含許多不同的部分視圖,它們將通過調用Html.Renderaction進行呈現。但是管理員可以爲某個角色排除局部視圖的切換,或者他可以完全停用整個應用程序的操作因此,我打算爲Html.RenderAction添加一個擴展方法,該方法將依次檢查角色並查看角色可以訪問特定的操作。這個動作映射的角色是在xml中用餐,我打算只在內存數據結構中加載這個xml一次。並有html助手擴展看看這個數據結構。這是一個好方法嗎?有更好的方法嗎?asp.net MVC 4 - Htmlhelper擴展

@section column2 { 
     @{Html.RenderActionIfIfAllowed("DashboardItem_Users", "DashBoard",User);} 
     } 

     @section column3 { 
     @{Html.RenderActionIfIfAllowed("DashboardItem_Orders", "DashBoard", User);} 
     } 

我必須呈現上面的partialviews。所以我創建了一個名爲Html.RenderActionIfIfAllowed的html助手擴展。

public static class HtmlHelperExtensions 
{ 
    public static void RenderActionIfIfAllowed<TModel>(this HtmlHelper<TModel> htmlHelper, string actionName, string controllerName, IPrincipal user) 
    { 
     //We can use the layour manager class to check if a particular role has access to an action and also if the action is active. 
     //Hard coding here just for demo purpose 
     if (user.IsInRole("Admin") && actionName != "DashboardItem_Users") 
     { 
      System.Web.Mvc.Html.ChildActionExtensions.RenderAction(htmlHelper, actionName, controllerName); 
     } 
     else if (user.Identity.IsAuthenticated && !user.IsInRole("Admin")) 
     { 
      System.Web.Mvc.Html.ChildActionExtensions.RenderAction(htmlHelper, actionName, controllerName); 
     } 
    } 

} 

之所以這樣做的方式是因爲我們想動態顯示或不顯示基於視圖是否是活動還是不用戶aprtial視圖。我們將讀取XML文件,該文件會說視圖是否是活動不是一個用戶,並使其相應

+0

你好哈日,我不能正確認識這個問題。你可以試着更好地解釋自己嗎?也許用你想要完成的代碼示例? – amhed 2013-02-26 04:02:07

+0

添加的代碼示例 – 2013-02-26 04:09:57

+0

這裏唯一錯誤的是您對「DashboardItems_Users」actionName等內容進行了硬編碼檢查。抽象像這樣的方法的目的是在View上編寫更少的代碼以提高可讀性。如果你可以找到一種檢查方式是通用的(比如從XML中的角色列表讀取數據,或者從數據庫表中指定權限),那麼是的,我認爲這很好:) – amhed 2013-02-26 04:24:55

回答

0

我用來創建視圖模型,這和設置布爾屬性

public class DashBoardViewModel{ 

public DashBoard dashBoard{get;set;} 

bool showItemDashBoard{get;set;} 

bool showOrderDashBoard{get;set;} 

} 

在控制器I驗證用戶角色並設置這些布爾屬性。

在查看

if(Model.showItemDashBoard){ 
    @Html.RenderAction("Action","Controller") 
}