我已经下载了MVC4并试图弄清楚捆绑功能在标准项目中的工作原理.似乎有捆绑:
<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/Scripts/js")"></script>
Run Code Online (Sandbox Code Playgroud)
返回所有jquery.js文件,但不包括所包含脚本中的knockout.js文件.为什么是这样?还有什么是_references.js文件,为什么knockout.js文件被注释掉了?
我正在关注一个示例,并且在为MVC项目创建自定义包时无法使"NoTransform"工作.这是我的代码无法编译,因为"NoTransform"产生一个错误,上面写着"错误1无法找到类型或命名空间名称'NoTransform'(你是否缺少using指令或程序集引用?)" .有什么想法吗?
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.WebPages;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace CoyleAzure
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
// Added to Add DisplayModes
DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("Phone")
{
ContextCondition = (context => (
(context.GetOverriddenUserAgent() != null) &&
(
(context.GetOverriddenUserAgent().IndexOf("iPhone", StringComparison.OrdinalIgnoreCase) >= 0) ||
(context.GetOverriddenUserAgent().IndexOf("iPod", StringComparison.OrdinalIgnoreCase) >= 0) ||
(context.GetOverriddenUserAgent().IndexOf("Droid", StringComparison.OrdinalIgnoreCase) >= 0) ||
(context.GetOverriddenUserAgent().IndexOf("Blackberry", StringComparison.OrdinalIgnoreCase) >= 0) …Run Code Online (Sandbox Code Playgroud) 我正在使用RC,我已经通过NuGet查看了所有内容都是最新的.在我的global.asax.cs中我得到了:
BundleTable.Bundles.AddDefaultFileExtensionReplacements();
BundleTable.Bundles.AddDefaultIgnorePatterns();
BundleTable.Bundles.AddDefaultFileOrderings();
Bundle scripts = new Bundle("~/Scripts");
scripts.IncludeDirectory("~/Scripts", "*.js");
BundleTable.Bundles.Add(scripts);
Bundle css = new Bundle("~/Content/css");
css.IncludeDirectory("~/Content/css", "*.css", false);
BundleTable.Bundles.Add(css);
Run Code Online (Sandbox Code Playgroud)
我尝试了一些不同的配置而没有任何改进.
然后在我的布局中我得到了:
<link href="@BundleTable.Bundles.ResolveBundleUrl("~/Content/css")" rel="stylesheet" type="text/css" />
<script src="@BundleTable.Bundles.ResolveBundleUrl("~/Scripts")"> </script>
Run Code Online (Sandbox Code Playgroud)
当页面加载它看起来很体面的网址时:
<link href="/Content/css?v=QAsFYXHCbnaU70oGVxpgi9py9iKQrT9C4BVNdHa7xoI1" rel="stylesheet" type="text/css" />
Run Code Online (Sandbox Code Playgroud)
但该网址重定向到:
/Content/css/
Run Code Online (Sandbox Code Playgroud)
返回404找不到错误...

有人有任何想法吗?
asp.net-mvc resourcebundle asp.net-mvc-4 asp.net-optimization
我有用VS2010创建的MVC4 RC项目.我不确定发生了什么,突然间我开始收到以下错误:
错误1"System.Web.Optimization.BundleCollection"不包含关于"RegisterTemplateBundles"的定义和没有扩展方法"RegisterTemplateBundles"接受类型"System.Web.Optimization.BundleCollection"的第一个参数可以找到(是否缺少使用指令或汇编引用?)C:\ xxxx\xxxx\Global.asax.cs 40 33 xxxx
错误来自Application_Start():
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
BundleTable.Bundles.RegisterTemplateBundles();
}
Run Code Online (Sandbox Code Playgroud)
我在Global.asax.cs文件中使用以下语句:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗????
我理解并完全理解新的bundle通配符{version}正则表达式,因为即使在更新后它也会继续拾取你的脚本和样式库.问题是我无法让它有效地工作.
我之前使用以下表示法来获取我的jQuery脚本:
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-1.*"));
Run Code Online (Sandbox Code Playgroud)
它会拾取与星号通配符匹配的所有文件.
但是,当我尝试以下内容时:
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));
Run Code Online (Sandbox Code Playgroud)
我注意到jQuery文件没有写到_Layout.cshtml页面.
注意 - 我确实在两个示例中使用以下HTML代码:
@Scripts.Render("~/bundles/jquery")
Run Code Online (Sandbox Code Playgroud)
当我使用上面的第一个例子("*")表示法时,会将以下内容写入页面:
<script src="/Scripts/jquery-1.7.2.js" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)
但是,当我使用"{version}"表示法时,只有一个空的空间,应该写入库.这适用于jquery文件以及相关的CSS样式表.
无论我是在编译DEBUG还是RELEASE模式都没关系.结果是一样的.显然在发布模式下,我会在使用"*"表示法时获得优化版本:
<script src="/bundles/jquery?v=VUv2YOeuOgHad-FHZ-vGMDu9wN1j9VZGifI1SBUUSMs1" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)
因此,作为所有开发人员的完美主义者,我非常希望看到{version}符号对我有用,因为我确实了解新版本并希望对我的部署进行此控制.
非常感谢任何洞察我可能做错的事情.
提前谢谢,丹
据我可以告诉(因为坦率地说文档上System.Web.Optimization非常稀少),捆绑在ASP.NET的工作方式是,你注册一组文件(JavaScript或CSS,相应的ScriptBundle和StyleBundle),并将它们与虚拟路径关联; 例如,~/bundles/jqueryui对于所有jQuery UI脚本.稍后,当您在非调试模式下运行时,ASP.NET可以缩小这些文件,并且缩小版本将在您为该包指定的虚拟路径上可用.
默认的bundle setup将一些脚本包注册~/bundles/...为虚拟路径,将一些CSS注册~/Content/css为虚拟路径.我的问题是,这不一致吗?那岂不是更有意义,有一些像~/bundles/js/...和~/bundles/css/...?实际上,该~/Content目录实际上是作为真实目录存在的,因此甚至存在名称冲突的可能性.我原以为你希望你的虚拟包路径是默认情况下不存在的目录,并不打算在实际的文件系统上创建.是否有一些原因~/Content/css用于我不理解的CSS捆绑虚拟路径?
在优化开启时从包中呈现样式时,您可以获得:
<link href="/Content/themes/base/css?v=UM624qf1uFt8dYtiIV9PCmYhsyeewBIwY4Ob0i8OdW81" rel="stylesheet" type="text/css" />
Run Code Online (Sandbox Code Playgroud)
不幸的是,Android浏览器似乎没有加载带有查询字符串的URL.有没有办法在System.Web.Optimization中自定义此字符串?
编辑:
我的问题得到解答,我试图检测用户代理字符串上的android,并用一个查询字符串替换样式表.显然,我有问题,是不是因为查询字符串,它是精缩是造成它不能完全加载样式表在Android股票浏览器中的web字体的CSS版本.
Android股票浏览器无法加载带有转义反斜杠的css内容字符串,这是ASP.NET缩小器的一种解决方法,它会错误地缩小相同的css内容字符串.我最终将图标字体css样式放在它自己的"手工缩小"样式表上.
我希望能够在生产环境中缩小/捆绑我的javascript文件,同时在本地调试时让它们不受限制/非捆绑; 但是,VS2012中的默认WebForms站点似乎不允许它.
重现我的问题的步骤:
MsAjaxJS和WebFormsJsweb.config,默认情况下有:
<compilation debug="true" targetFramework="4.5">
Run Code Online (Sandbox Code Playgroud)
我甚至尝试通过明确告诉BundleTable不要优化来修改Global.asax :
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
BundleTable.EnableOptimizations = false;
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterOpenAuth();
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
Run Code Online (Sandbox Code Playgroud)
然而,我仍然得到不可判断的javascript文件:

这个站点(我意识到它是用于MVC)告诉我,无论是debug="true"在web.config还是BundleTable.EnableOptimizations = false;在Global.asax中,都应关闭该功能.而这个网站,(这是对WebForms和从第一个链接),并没有提到将其关闭进行调试.
我怎么能(干净地)告诉我的项目只在debug ="false"时缩小/捆绑?
(我正在使用ASP.NET 4.5)
编辑:
这个问题和这个问题是相似的,但他们都只提供使用的解决方案Scripts.Render().有没有办法用模板化的ScriptManager方法完成这个?
使用ASP.NET捆绑ScriptBundle
function StartController($scope, $location, $rootScope) {}
Run Code Online (Sandbox Code Playgroud)
变成了
function StartController(n,t,i) {}
Run Code Online (Sandbox Code Playgroud)
但是,由于我使用的是AngularJs,因为依赖注入仍然有效,因此在缩小时不得更改参数名称.我怎样才能确保$ scope,$ location和$ rootScope通过ScriptBundle保持这些名称的缩小,但是允许在其他地方重命名参数?
我在我的项目中使用 System.Web.Optimizations BundleConfig。我在网站上使用的特定 jQuery 插件遇到了问题。如果我将文件添加到我的 ScriptBundle 中,它在调试模式下工作正常,但在发布模式下抛出 JavaScript 错误(即设置 Web.config debug=false)。我认为有些东西没有被正确缩小。
所有其他脚本都没有给我带来任何问题,因此我不想影响所有捆绑包的行为,但有没有一种方法可以针对特定捆绑包进行自定义,以告诉它在调试中使用特定版本并在发布中使用最低版本。
我知道它的默认行为是查找 .min 文件,但我似乎无法让它工作。谁能告诉我这里可能缺少什么?感谢您的帮助。
这是我自己拆分的例子。这在调试中有效,但当我在 web.config 中设置 debug=false 时无效
ScriptBundle layoutBundle = new ScriptBundle("~/jsbundles/jquery/layout");
layoutBundle.Include("~/Scripts/plugins/jquery.layout-latest.js");
bundles.Add(layoutBundle);
Run Code Online (Sandbox Code Playgroud)