【问题标题】:asp.net MVC 4 - Htmlhelper extensionsasp.net MVC 4 - Htmlhelper 扩展
【发布时间】:2023-03-25 10:50:01
【问题描述】:

我正在为 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 文件,该文件将说明视图是否对用户处于活动状态并相应地呈现它

【问题讨论】:

  • 你好 Hari,我无法正确理解这个问题。你能试着更好地解释自己吗?也许有你想要完成的代码示例?
  • 这里唯一的错误是您对“DashboardItems_Users”actionName 之类的内容进行了硬编码检查。像这样抽象方法的目的是在 View 上编写更少的代码,从而提高可读性。如果您可以找到一种通用检查的方法(例如从 XML 中的角色列表或从数据库表上指定的权限中读取),那么是的,我认为这很好:)

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


【解决方案1】:

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

public class DashBoardViewModel{

public DashBoard dashBoard{get;set;}

bool showItemDashBoard{get;set;}

bool showOrderDashBoard{get;set;}

}

在控制器中,我验证用户角色并设置这些布尔属性。

在视图中

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多