标签: asp.net-optimization

ResolveBundleUrl没有解析所有文件?

我是MVC的新手,所以我想我会开始一个新项目并尝试MVC4中的一些新功能.我的Content目录中有两个css文件,normalise_minisite.css.当我使用以下代码时:

<link href="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/Content/css")" rel="stylesheet" type="text/css" />
Run Code Online (Sandbox Code Playgroud)

它只需要我的site.css文件而不是我的规范化文件.我的应用开始时有以下内容:

protected void Application_Start()
{

    // Remove all other view engines except razor:
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new RazorViewEngine());

    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    BundleTable.Bundles.RegisterTemplateBundles();
    BundleTable.Bundles.EnableDefaultBundles();
}
Run Code Online (Sandbox Code Playgroud)

我是否需要为每个css文件创建一个包(就像这个人一样)?或者它应该只是自动找到所有的css文件(我希望这是默认行为).值得注意的是,我开始将这个项目作为基于Razor视图引擎的空网站(实际上根本不是空的:/)

提前致谢


更新

根据发布的链接,我需要注释掉注册模板包的行.例如:

protected void Application_Start()
{

    // Remove all other view engines except razor:
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new RazorViewEngine());

    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    //BundleTable.Bundles.RegisterTemplateBundles();  // This is not needed
    BundleTable.Bundles.EnableDefaultBundles();
}
Run Code Online (Sandbox Code Playgroud)

这现在有效.我的想法是两条线应该没有任何问题共存.我想这是设计的,但是设计不好吗?

c# optimization asp.net-mvc-4 asp.net-optimization

11
推荐指数
1
解决办法
7009
查看次数

本地化的scriptbundle解决方案

嗨,我目前正在使用asp.net MVC 4 rc与System.Web.Optimization.由于我的网站需要根据用户偏好进行本地化,因此我正在使用jquery.globalize插件.

我非常希望继承ScriptBundle类,并根据需要确定要捆绑的文件System.Threading.Thread.CurrentThread.CurrentUICulture.这看起来像这样:

bundles.Add(new LocalizedScriptBundle("~/bundles/jqueryglobal")
                             .Include("~/Scripts/jquery.globalize/globalize.js")
                             .Include("~/Scripts/jquery.globalize/cultures/globalize.culture.{0}.js", 
                                       () => new object[] { Thread.CurrentThread.CurrentUICulture })
                    ));
Run Code Online (Sandbox Code Playgroud)

例如,如果ui文化是"en-GB",我希望拾取以下文件(当然缩小,如果可能的话,也会缓存,直到脚本文件或currentui文化发生变化).

  • "〜/脚本/ jquery.globalize/globalize.js"
  • "〜/ Scripts/jquery.globalize/globalize-en-GB.js"< - 如果此文件在服务器文件系统上不存在,则回退到globalize-en.js.

我尝试使用类似下面的内容重载Include方法,但这不会起作用,因为它不是根据请求进行评估,而是在应用程序启动时进行评估.

public class LocalizedScriptBundle : ScriptBundle
{
    public LocalizedScriptBundle(string virtualPath)
        : base(virtualPath) { 
    }

    public Bundle Include(string virtualPathMask, Func<object[]> getargs) {
        string virtualPath = string.Format(virtualPathMask, getargs());
        this.Include(virtualPath);
        return this;
    }

}
Run Code Online (Sandbox Code Playgroud)

谢谢

康斯坦丁

asp.net-mvc localization bundling-and-minification asp.net-optimization

11
推荐指数
1
解决办法
3507
查看次数

如何使用System.Web.Optimization包来处理IIS虚拟目录中的自定义文件夹?

我有一个asp.net mvc4.我有使用IIS虚拟目录在此应用程序中部署为子目录的模块,我需要引用这些模块中的文件.这些模块dll正在注册捆绑包.但捆绑包不会在html页面中生成任何内容.

从这篇文章中可以看出,它可能是单元测试-bicleconfig-in-mvc4,我看到内部捆绑包正在使用Server.MapPath.所以它似乎应该工作.

我连接了BundleTable.MapPathMethod,甚至自己调用了Server.MapPath,它正确地解析到了正确的物理目录.但它仍然不会在html页面中呈现任何内容.

然后就是这篇帖子,为什么做了解决方案,不为自定义文件夹工作,提到自定义文件夹的"AddDirectory"功能但是这个功能在最新的优化库中不再可用.

我也试过使用新的"IncludeDirectory"方法,但这也不起作用

ScriptBundle scriptBundle = new ScriptBundle("~/bundles/jquery");
scriptBundle.IncludeDirectory(basePath + "/Scripts/","jquery-1.*");
bundles.Add(scriptBundle);
Run Code Online (Sandbox Code Playgroud)

还有什么我可以尝试使这项工作?


12年8月27日

问题解答:基本上,System.Web.Optimization不适用于作为子IIS虚拟目录的Web URL.

问题是BundleResolver.GetBundleContents中的这些代码行

string mapPathMethod = this.MapPathMethod("~/");
if (!file.FullName.StartsWith(mapPathMethod, StringComparison.OrdinalIgnoreCase))
Run Code Online (Sandbox Code Playgroud)

这基本上假设捆绑的每个文件都位于主Web应用程序PHYSICAL文件夹下的PHYSICAL文件夹中.

IMO的问题在于,正在搜索要包含的文件的Web相对URL路径很早就被转换为物理路径,并且所有对用于获取这些物理文件的相对URL路径的引用都被丢弃了.

所以,为了看看我是否可以完成这项工作,我不得不将System.Web.Optimization反编译为裸代码,然后再重新编译,以便我可以"修复"它.第一步是将一个RelativePath属性添加到BundleItem,这是BundleItem的一个额外构造函数,用于传递源相对url路径以保留Web相对搜索目录文件夹的内容.然后我用循环替换上面的代码,然后基本上尝试重新匹配用BundleItem找到的文件,以便它们可以转换回有效的web url

foreach (BundleItem bundleItem in bundleFor.Items)
{
  if (file.FullName.StartsWith(bundleItem.Path, StringComparison.OrdinalIgnoreCase)){
    string str = file.FullName.Replace(bundleItem.Path,bundleItem.RelativePath);
    str = str.Replace('\\', '/');
    strs.Add(str);
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我的捆绑包正在渲染.但请注意,我尚未测试此hack修复程序是否已发布或已进行优化或缩小.

我真的认为asp.net团队应该在IIS虚拟目录中制作System.Web.Optimizations支持文件.特别是现在VS2012支持IIS Express,最终使构建模块化Web应用程序变得更容易,文件通过IIS虚拟目录引用

.net asp.net-mvc-4 asp.net-optimization system.web.optimization

11
推荐指数
1
解决办法
3719
查看次数

ASP.NET MVC4捆绑CSS有些在CDN上有些本地服务器吗?

我正在研究ASP.NET MVC4 System.Web.Optimization捆绑,并想知道如何从CDN其他本地服务器提供一些CSS文件

那可能吗?

它看起来像bundles.UseCdn = true在集合级别而不是单个包的设置.

任何指导将不胜感激.

css cdn asp.net-mvc-4 bundling-and-minification asp.net-optimization

11
推荐指数
2
解决办法
7008
查看次数

为什么MVC4捆绑和缩小使我的文件更大?

我正在实现MVC4中的捆绑和缩小支持,看起来好像它使我的javascript文件比没有捆绑/缩小时更大.我正在使用nuget中提供的最新版本(预发布选项).我在RegisterBundles类中设置了以下包.

bundles.Add(new ScriptBundle("~/bundles/baseJS").Include(
                    "~/Scripts/jquery-1.7.1.js",
                    "~/Scripts/jquery.cookie.js",
                    "~/Scripts/jquery-ui-1.8.11.js",
                    "~/Scripts/bootstrap.js",
                    "~/Scripts/jquery.pjax.js",
                    "~/Scripts/kendo/2012.1.515/js/kendo.all.min.js",
                    "~/Scripts/jquery.jstree.js",
                    "~/Scripts/jquery.unobtrusive-ajax.js",
                    "~/Scripts/jquery.validate.js",
                    "~/Scripts/jquery.validate.unobtrusive.js",
                    "~/RIS.Scripts/PostJson.js"));
Run Code Online (Sandbox Code Playgroud)

我正在使用它将它加载到我的_Layout.cshtml中

@Scripts.Render("~/bundles/baseJS")
Run Code Online (Sandbox Code Playgroud)

当我在调试模式中为这些脚本添加Fiddler中收到的字节时,我得到以下内容

Name                        Size(bytes)
jquery                      98013
jquery cookie               1455
jquery ui                   124704
bootstrap                   52378
pjax                        8138
kendo.all                   219751
jstree                      55045
unobtrusive-ajax            2492
validate                    13323
validate-unobtrusive        5138
postjson                    634

Total                       581071
Run Code Online (Sandbox Code Playgroud)

当我在我的生产服务器上运行它时,我从fiddler获得了整个js包的以下内容.

Bytes Received:  999,396    
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?大多数文件在某种程度上都是缩小的,但它的大小不应该是我的有效载荷的两倍.

其他细节 - 当我从我的本地开发盒(fiddler报告大小为379kb)和服务器(小提琴手报告大小为999kb)下载js文件并将它们放入kdiff时它们是二进制相同的.当我查看Chrome的开发者工具网络选项卡时,本地服务器下载379kb,但"Parser"值为975kb.什么是解析器值.是否有一些IIS压缩设置未在我的服务器中设置但在我的本地IIS服务器上?我注意到的唯一区别是我在我的开发机器上运行的IIS Express是8.0,其中服务器是IIS 7.5.

asp.net-mvc-4 asp.net-optimization

10
推荐指数
1
解决办法
8399
查看次数

是否有可能在MVC4中对BundleConfig进行单元测试?

据我所知,答案是否定的.我看到的问题来自课堂上的Include(params string[])方法System.Web.Optimization.Bundle.在内部调用System.Web.Optimization.IncludeDirectory(string, string, bool),然后使用此代码:

DirectoryInfo directoryInfo = new DirectoryInfo(
    HttpContext.Current.Server.MapPath(directoryVirtualPath));
Run Code Online (Sandbox Code Playgroud)

虽然可以HttpContext.Current在单元测试期间设置,但我无法弄清楚如何使其.Server.MapPath(string directoryVirtualPath)返回非空字符串.由于DirectoryInfo(string)构造函数在传递null参数时抛出异常,因此这样的测试将始终失败.

.NET团队对此有何建议?我们是否必须将捆绑配置作为集成测试或用户验收测试的一部分进行单元测试?

unit-testing asp.net-mvc-4 bundling-and-minification asp.net-optimization

10
推荐指数
2
解决办法
3149
查看次数

ASP.NET捆绑/缩小:包括动态生成的Javascript

我有一个动态生成Javascript的网站.生成的代码描述了类型元数据和一些服务器端常量,以便客户端可以轻松使用服务器的服务 - 因此它可以缓存.

生成的Javascript由ASP.NET MVC控制器提供服务; 所以它有一个Uri; 说~/MyGeneratedJs.

我想将这个Javascript包含在Javascript包中,包含其他静态Javascript文件(例如jQuery等):所以就像静态文件一样,我希望它在调试模式下单独引用,并在与非其他文件捆绑的缩小形式中引用调试模式.

如何在捆绑中包含动态生成的Javascript?

asp.net-mvc .net-4.5 bundling-and-minification asp.net-optimization

10
推荐指数
2
解决办法
3050
查看次数

Web.Optimizations - 从样式/脚本包中获取所有包含的任何方式?

我正在使用一些动态捆绑,它根据配置添加CSS和JS文件.

我启动了一个新的StyleBundle,这样:

var cssBundle = new StyleBundle("~/bundle/css");
Run Code Online (Sandbox Code Playgroud)

然后循环通过配置并添加任何找到的包括:

cssBundle.Include(config.Source);
Run Code Online (Sandbox Code Playgroud)

循环之后,我想检查是否包含任何文件/目录.我知道有EnumerateFiles(),但我不认为这100%是为了这个目的.

其他人以前做过类似的事吗?

c# asp.net asp.net-mvc bundling-and-minification asp.net-optimization

10
推荐指数
1
解决办法
6397
查看次数

MVC4局部视图javascript捆绑问题

我正在使用visual studio 11开发一个项目ASP.net 4,MVC4(RC).我正在尝试渲染一个呈现局部视图的MVC4 Razor视图.我的部分视图需要一些JavaScript.在我的部分视图中,当我在脚本部分中包含我的javascript,如下所示它似乎没有加载.

@section Scripts {
    <script type="text/javascript">
        $(function () {
            alert("test");
        });
    </script>
}
Run Code Online (Sandbox Code Playgroud)

如果我删除脚本部分它失败,因为当文档就绪代码运行时,jquery库(在我的_Layout.cshtml页面上捆绑并呈现)尚未加载.

<script type="text/javascript">
    $(function () {
        alert("test");
    });
</script>
Run Code Online (Sandbox Code Playgroud)

_Layout Page代码加载jquery库

@Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)
Run Code Online (Sandbox Code Playgroud)

有没有人知道这个解决方案,还是我只是错误的方式?它破坏了我的头!

javascript asp.net-mvc-4 bundling-and-minification asp.net-optimization

9
推荐指数
1
解决办法
2万
查看次数

仅在MVC4 BundleConfig中缩小脚本

我在BundleConfig中添加以下ScriptBundle:

    bundles.Add(new ScriptBundle("~/bundles/javascript").Include(
        "~/Scripts/jquery-1.*",
        "~/Scripts/load-image.min.js",
        "~/Scripts/bootstrap.*",
        "~/Scripts/bootstrap-image-gallery.*",
        "~/Scripts/my.global.js"));
Run Code Online (Sandbox Code Playgroud)

这在我的_Layout.cshtml末尾被引用为:

@Scripts.Render("~/bundles/javascript")
Run Code Online (Sandbox Code Playgroud)

调试时我注意到这个脚本呈现的输出是:

<script src="/Scripts/jquery-1.8.2.js"></script>
<script src="/Scripts/bootstrap.js"></script>
<script src="/Scripts/bootstrap-image-gallery.js"></script>
<script src="/Scripts/my.global.js"></script>
Run Code Online (Sandbox Code Playgroud)

注意load-image.min.js脚本丢失了?我想要的是使用相同的缩小脚本,无论我是否正在调试.在发布条件下,脚本包含在捆绑的JS文件中.

我认为它正在看'min',寻找一个未缩小的版本,而不是找到一个,然后决定什么是最好的完全忽略它.辉煌.如果我复制了load-image.min.js,请将其命名为load-image.js,然后在BundleConfig中将其作为"load-image.*"引用.我发现它包含在两个配置中但是有什么意义去做?

我想我在这里错过了一些东西.我没有非缩小版本,坦率地说我并不关心它.它被我的Bootstrap图像库插件使用,没有别的.有什么想法吗?

asp.net-mvc bundle razor asp.net-mvc-4 asp.net-optimization

9
推荐指数
2
解决办法
8219
查看次数