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)
我的网站有很多 级别 的用户权限。
因此 初级 用户不能做 高级 用户可以做的事情。 (用户有很多级别,高级与初级只是为了简化).
在 添加 服务器端验证谁是用户以及他 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)