【问题标题】:Is it possible to include virtual resources in a bundle?是否可以在捆绑包中包含虚拟资源?
【发布时间】:2014-01-24 02:35:03
【问题描述】:

使用 MVC4,我为 css 文件创建了一个控制器,以便我可以将模型传递给它们并在 css 中使用 razor 语法。

为了不破坏现有的 css 文件,这些特殊 css 文件在请求它们的路径中不存在。

我尝试将这些文件包含在一个包中,但它们没有出现在页面输出中。

bundles.Add(New StyleBundle("~/Content/site/css").Include("~/Styles/site.css"))

请注意 ~/Styles/site.css 在磁盘上不存在。但是,StylesController 会正确处理此问题,并在您要求时返回预期的内容。

我的猜测是捆绑器发现磁盘上没有文件并从输出中排除该路径。但我不知道如何让它不在乎。

关于如何让这些文件与捆绑包一起玩有什么想法吗?

【问题讨论】:

  • 你的虚拟资源是通过VirtualPathProvider实现的吗?
  • 他们不是。它们作为视图访问。请求/Styles/site.css 将访问StylesControllerSite 操作。此操作将返回 /Views/Styles/site.css.vbhtml 视图。
  • 在这种情况下,过期将如何工作,因为捆绑包是自动跟踪的,并且 ASP.NET 使用上次修改日期时间来创建一个哈希来标识唯一捆绑包版本,并且它具有很长的缓存。
  • 我没有考虑过期。我不是捆绑专家。你有什么建议吗?
  • Bundles 的过期时间很长,如果你将资源包装在 bundle 周围并且如果你的资源发生变化,bundle 仍然会发送旧资源。如果您的资源是虚拟的,您可以使用 OutputCache 轻松缓存资源,您不需要捆绑。然而 bundle 提供了最小化并将多个文本资源组合成一个,但主要的好处仍然是缓存。

标签: asp.net-mvc-4 bundle


【解决方案1】:

这样试试

bundles.Add(New StyleBundle("~/Content/site/css")
.Include("~/Styles/site.css",new CssRewriteUrlTransform()))

【讨论】:

  • MVC 4、.NET 4.5 似乎没有 CssRewriteUrlTransform 类。但谷歌似乎认为这是一个可以解决的问题。
【解决方案2】:

我知道这个问题很老,但我在尝试在每个页面中包含客户端验证包而不手动包含每个文件时遇到了这个障碍。由于 CssRewriteUrlTransform 似乎没有为我做任何事情,所以我使用了下一个类

public class CustomScriptBundle : ScriptBundle
{
    public CustomScriptBundle(string virtualPath, IBundleOrderer orderer)
        : base(virtualPath)
    {
        Orderer = orderer;
    }
    public CustomScriptBundle(string virtualPath)
        : this(virtualPath, new NonOrderingBundleOrderer())
    {

    }
    public CustomScriptBundle IncludeVirtual(string virtualPath)
    {
        this.Include(new BundleResolver().GetBundleContents(virtualPath).ToArray());
        return this;
    }
}

附言: NonOrderingBundleOrderer 是一个不按字母顺序对包中包含的文件进行排序的类

【讨论】:

  • 谢谢分享。我期待着尝试这个解决方案。
猜你喜欢
  • 2011-06-04
  • 1970-01-01
  • 2015-01-04
  • 2017-05-27
  • 2011-09-30
  • 1970-01-01
  • 2014-09-27
  • 2016-01-26
  • 1970-01-01
相关资源
最近更新 更多