asp.net MVC 4 - Htmlhelper扩展

时间:2013-02-26 02:35:19

标签: asp.net-mvc asp.net-mvc-4 authorization

我正在为Html.RenderAction创建一个自定义的HtmlHelper扩展。我的父视图将包含许多不同的部分视图,这些视图将通过调用Html.Renderaction来呈现。但管理员可以为某个角色排序部分视图的切换,或者他可以完全停用整个应用程序的操作所以我打算为Html.RenderAction设置一个扩展方法,然后检查该角色并查看是否角色可以访问特定的操作。这个角色到动作的映射在xml中是有用的,我打算只在内存数据结构中加载一次这个xml一次。并让html助手扩展查看该数据结构。这是一个好方法吗?有更好的方法吗?

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

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

我必须渲染上面的偏见。所以我创建了一个名为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);
        }
    }

}

这样做的原因是因为我们希望根据视图是否处于活动状态来动态显示或不显示用户的特定视图。我们将读取一个xml文件,该文件将说明视图是否处于活动状态而不是用户并相应地呈现它

1 个答案:

答案 0 :(得分:0)

我曾经为此创建ViewModel并设置bool属性

public class DashBoardViewModel{

public DashBoard dashBoard{get;set;}

bool showItemDashBoard{get;set;}

bool showOrderDashBoard{get;set;}

}
  

在Controller中我验证用户角色并设置这些布尔属性。

在视图中

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