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

ASP.NET's Conditional bundling - real world implementation?

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

因此 初级 用户不能做 高级 用户可以做的事情。 (用户有很多级别,高级与初级只是为了简化).

添加 服务器端验证谁是用户以及他 can/t 做了什么 — 我也想要 NOT提供Javascript功能注册首位。 (所以如果用户是初级用户,那么他的JS文件不应该包含高级用户的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

Note that you must have a separate bundle per page. You should not modify one and the same bundle on the fly....etc...

所以,我创建了(目前)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 文件(缩小)。

一种方法是使用 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)