2013-02-26 112 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") 
}