ASP.NET的条件捆绑 - 真实世界的实现?

时间:2015-09-08 11:32:47

标签: asp.net asp.net-mvc bundling-and-minification

我的网站中有很多级别的用户权限。

因此 junior 用户无法执行 senior 用户可以执行的操作。 (有很多级别的用户。高级vs初级只是为了简化)

添加到服务器端验证谁是用户以及他能做什么 - 我还希望 NOT 提供 Javascript 功能注册在第一个地方。 (因此,如果用户是 junior 用户,那么他的JS文件不应包含 senior 用户的JS函数。)

示例:

该网站有一般add个javascript函数,应该出现在所有用户身上:

function add() {
    console.log("Add");
}

初级用户拥有更高的权限,因此他们也可以subtract。所以他们的JS文件包含subtract方法:

function substract() {
    console.log("substract");
}

一般用户不会使用此substract方法

高级用户拥有更高的权限,因此他们也可以power。所以他们的JS文件包含power方法:

function power() {
    console.log("power");
}

高级用户不会拥有此power方法

根据this answer

  

请注意,每页必须有一个单独的包。你不应该   动态修改同一个包......等等......

所以,我创建了(现在)2个捆绑包,每个页面一个:

bundles.Add(new ScriptBundle("~page1Junior").Include(
                      "~/Scripts/General.js", "~/Scripts/Junior.js"));

bundles.Add(new ScriptBundle("~page1Senior").Include(
                      "~/Scripts/General.js", "~/Scripts/Senior.js"));

然后我根据一些登录信息获取相关的捆绑包并使用:

<script src='@Scripts.Url("~/page1Senior (or) Junior")' async> </script>

问题

这似乎是一种错误的方法。

如果我有10个页面和10个用户级别,根据这种方法,我需要 100 不同的捆绑包。

为相关用户权限提供适当的js文件的正确方式是什么?

我之后的伪代码:

user level       js files(combined to one)
------------|-------------
    1            [a,b]
    2            [a,b,c]
    3            [a,b,c,d]
    4            [a,b,c,d,e]

因此,如果用户级别3已登录,则应提供单个abcd.js JS文件(缩小)。

1 个答案:

答案 0 :(得分:3)

一种方法是使用DynamicBundleFolder

如果你有一个像

这样的目录结构
Scrtips
-- /Permissions
   -- /1
      -- a.js
      -- b.js
   -- /2
      -- a.js
      -- b.js
      -- c.js
   -- /3
      -- c.js
      -- d.js

其中1,2,3是限制级别,然后在RegisterBundles添加DynamicBundle

bundles.Add(new DynamicFolderBundle("userScripts", "*.js",new JsMinify()));

然后在你的_layout.cshtml中,你可以做到

@{
    var userPermissionLevel = 2; // grab your user permission level, from session maybe
}

@Scripts.Render("~/Scripts/Permissions/"+ @userPermissionLevel +"/userScripts")

这将呈现该目录中的所有脚本。您不必为每个页面创建包。如果您需要添加基于新权限的文件,只需添加到相应的权限文件夹。

更新:如果每个权限级别都有唯一的js文件,这将正常工作。对于共享文件,更新它们将是一项非常重要的工作。所以你可以做的是根据权限级别创建捆绑包,如

    // Bundle for permission level 1
    bundles.Add(new ScriptBundle("~/bundles/permissions/1").Include(
                            "~/Scripts/a.js")
                            .Include("b.js"));

    // Bundle for permission level 2
    bundles.Add(new ScriptBundle("~/bundles/permissions/2").Include(
                            "~/Scripts/b.js")
                            .Include("c.js"));

   // and so on for each level 3,4,5 include specific level files

然后您可以将它们添加到_layout.cshtml

页面
@{
   var userPermissionLevel = 2; // grab your user permission level, from session maybe
 }

@Scripts.Render("~/bundles/permissions/"+userPermissionLevel)
相关问题