【问题标题】:render unbundled assets for admin user role为管理员用户角色呈现非捆绑资产
【发布时间】:2014-08-01 00:01:10
【问题描述】:

我是否可以为“管理员”角色的用户呈现未捆绑和未缩小的脚本和样式?

我已经搜索并找到了如何禁用捆绑

BundleTable.EnableOptimizations = ...

和缩小

foreach (Bundle bundle in bundles)
{
    bundle.Transforms.Clear();
}

在 Global.asax.cs Application_Start 中,但我希望这个逻辑针对每个用户,而不是每个应用程序实例,因此它不应该只在应用程序启动时运行。

【问题讨论】:

  • 只是在说我的帽子,但是动作过滤器呢?
  • 同意@emodendroket,你绝对可以在action filter中设置BundleTable.EnableOptimizations为true/false。
  • 或者Application_PostAuthenticateRequest

标签: c# asp.net asp.net-mvc bundle bundling-and-minification


【解决方案1】:

首先,BundleConfig 中包含的样式或脚本不会被加载,除非通过调用 Scripts.Render() 或 Styles.Render() 方法将其包含在视图中。默认情况下,这些方法是从 _Layout.schtml 页面(视图/共享)调用的。

@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")

为管理区域创建不同的布局页面并加载所需的脚本和样式将是更好的选择。

也可以使用相同的方法 Scripts.Render() 从任何 .cshtml 文件(视图)加载这些。在这种情况下,它会像,

@{
    if (User.IsInRole("Admin"))
    {
        //Update this portion with path of required bundles
        @Scripts.Render("~/bundles/jquery")
    }
    else
    {
        //Update this portion with path of required bundles
        @Scripts.Render("~/bundles/jquery")
        @Scripts.Render("~/bundles/jqueryval")
    }
}

上面的sn-p可以添加在_Layout页面或者其他任何页面中。

如果需要添加任何非捆绑代码。只需使用脚本标签。看起来像这样:

@{
    if (User.IsInRole("Admin"))
    {
        //required script or style files
    }
    else
    {
        //To include unbundled and unminified scripts
        <script type="text/javascript" src="~/Scripts/jquery.validate.js"></script>
    }
}

【讨论】:

  • 我不想在我使用@Scripts.Render@Styles.Render 的任何地方都写这些块...这不仅会涉及到太多的文件,这意味着我必须“手动”解开每个捆绑包,并为每个捆绑包中的所有内容维护单独的引用。就像我从我的 jquery 包中删除一个插件一样,我将不得不在某个管理块中追踪它的引用并将其也删除。
  • 您可以在单个包中包含管理员用户的脚本和样式,并将此 sn-p 添加到 _Layout.cshtml 页面中,这样您就不必在每个页面中都编写它。我对你的问题的理解不同。我以为您想为管理员用户添加不同的脚本和样式。
  • 我明白了。实际上,我想在整个站点中为管理员和非管理员提供相同的资产,只是为管理员解绑。我不仅在我的 _Layout 文件中引用了 JS 和 CSS,而且在我的许多视图文件中也引用了 JS 和 CSS,因此将它们中的每一个都包装在 if 块中并不适合我的情况。单一捆绑方法也不起作用,因为我不希望(例如:)在专用于 Angular webapp 的不同页面上运行主页滑块的 jquery 插件,反之亦然。
【解决方案2】:

我对 emodendroket 建议的实施,目前对我来说效果很好:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new DisableBundlingForAdminFilter());
        // other filters
    }

    private class DisableBundlingForAdminFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            #if !DEBUG
            BundleTable.EnableOptimizations = !filterContext.HttpContext.User.IsInRole("Admin");
            #endif
        }
    }
}

FilterConfig.RegisterGlobalFiltersApplication_Start 中被调用。

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2017-02-15
    • 1970-01-01
    相关资源
    最近更新 更多