相关疑难解决方法(0)

为什么ResolveBundleUrl不适用于自定义文件夹?(MVC Beta 4)

从一个全新的ASP.NET MVC 4 Beta Web应用程序,我正在重新安排我的文件夹以匹配Rob Conery的VidPub.Web示例

具体来说,这意味着内容的最终目录结构如下所示

VidPub.Web
 |
 ---Public
    |
    |---Images
          |--- *.png 
    |---javascripts
          |--- *.js 
    |---stylesheets
         |----themes
              |---base  
                  |--- images
                  |--- *.css
        |----site.css

但是,当我更改以下行时 _Layout.cshtml

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

<link href="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(
           "~/Content/themes/base/css")" 
           rel="stylesheet" 
           type="text/css" />

<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(
             "~/Scripts/js")"></script>
Run Code Online (Sandbox Code Playgroud)

<link href="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(
           "~/Public/stylesheets/css")"
           rel="stylesheet" 
           type="text/css" />

<link href="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(
           "~/Public/stylesheets/themes/base/css")" 
           rel="stylesheet" 
           type="text/css" />

<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(
           "~/Public/javascripts/js")"></script>
Run Code Online (Sandbox Code Playgroud)

在最终的HTML中,我最终没有任何结果.

<link rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/css" />
<script></script>
Run Code Online (Sandbox Code Playgroud)

为什么不在新位置拾取文件?

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

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

如何使用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
查看次数