2013-02-12 19 views
5

私はすべてのjavascriptとcssファイルを含むIIS上の仮想ディレクトリを持っています。バンドルを使用してこれらのファイルをASP.NET MVCアプリに含めることは可能ですか?絶対パスを使用したASP.NET MVCバンドル

私はすでにこのような何かを試してみました:

Only application relative URLs (~/url) are allowed.:

/公共/ JavascriptをIIS上の仮想ディレクトリです:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include("/public/javascript/jquery-{version}.js")); 

はなく、エラーが発生しました。

+0

MVC3または4を使用していますか?なぜ2度タグ付けするのですか? –

+0

私はこれも探しています。しかし、私はMVCバンドルが〜/ public/javascript/foo.jsのようなアプリケーション相対パス以外のものをサポートしていないことは恐れています – oruchreis

答えて

4

実際、バンドルクラスは絶対パスをサポートしていません。私は開店しましたa feature request here.

私はこの問題をカスタムVirtualPathProviderとコントローラで解決しました。しかし、それは非常に壊れやすい実装です。これまでに必要なものを変更することができます。

public class ModuleScriptProvider : VirtualPathProvider 
{ 
    public static IBundleModule GetModulePath(string moduleName) 
    { 
     //return the absolute or relative path. 
    } 

    public static void ParseVirtualPath(string virtualPath, out string moduleName, out string path) 
    { 
     var parts = virtualPath.Replace("~/", "").Split('/').Where(p => !string.IsNullOrEmpty(p)).Skip(1).ToList(); 
     if (parts.Count < 2 || !virtualPath.EndsWith(".js")) 
      throw new FileNotFoundException("Script file doesn't found in the module script directory", virtualPath); 
     moduleName = parts.First(); // ~/ModuleScript/ModuleName/.... 
     path = string.Join(@"\", parts.Skip(1)); 
    } 

    public static string MapPathMethod(string virtualPath) 
    { 
     if (IsModuleScriptPath(virtualPath)) 
     { 
      string moduleName; 
      string path; 
      ParseVirtualPath(virtualPath, out moduleName, out path); 
      var moduleDir = GetModulePath(moduleName); //absolute path 
      if (!moduleDir.EndsWith(@"\")) 
       moduleDir += @"\"; 
      return moduleDir + path; 
     } 
     return HttpContext.Current.Server.MapPath(virtualPath); 
    } 

    public static bool IsModuleScriptPath(string virtualPath) 
    { 
     String checkPath = VirtualPathUtility.ToAppRelative(virtualPath); 

     return checkPath.StartsWith("~/ModuleScript/", StringComparison.InvariantCultureIgnoreCase); 
    } 

    public override bool FileExists(string virtualPath) 
    { 
     return (IsModuleScriptPath(virtualPath) || base.FileExists(virtualPath)); 
    } 
    public override VirtualFile GetFile(string virtualPath) 
    { 
     if (IsModuleScriptPath(virtualPath)) 
      return new ModuleScriptVirtualFile(virtualPath); 
     return base.GetFile(virtualPath); 
    } 

    public override CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart) 
    { 
     if (IsModuleScriptPath(virtualPath)) 
     { 
      string moduleName; 
      string path; 
      ParseVirtualPath(virtualPath, out moduleName, out path); 
      var bundleModulePath = GetModulePath(moduleName); 
      return new CacheDependency(bundleModulePath); 
     } 

     return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
    } 
    public override string CombineVirtualPaths(string basePath, string relativePath) 
    { 
     return base.CombineVirtualPaths(basePath, relativePath); 
    } 
} 

class ModuleScriptVirtualFile : VirtualFile 
{ 
    private readonly string _path; 
    private readonly string _moduleName; 
    public ModuleScriptVirtualFile(string virtualPath) 
     : base(virtualPath) 
    { 
     ModuleScriptProvider.ParseVirtualPath(virtualPath, out _moduleName, out _path); 
    } 
    public override Stream Open() 
    { 
     var moduleDir = ModuleScriptProvider.GetModulePath(_moduleName); 
     if (!moduleDir.EndsWith(@"\")) 
      moduleDir += @"\"; 

     return new FileStream(moduleDir + _path, FileMode.Open); 
    } 
} 

コントローラー:

HostingEnvironment.RegisterVirtualPathProvider(new ModuleScriptProvider()); 
BundleTable.EnableOptimizations = true; 
BundleTable.MapPathMethod = ModuleScriptProvider.MapPathMethod; 

神スピード:Global.asaxのApplication_Startメソッドで

public class ModuleScriptController : Controller 
{ 
    public FileStreamResult GetFile(string path) 
    { 
     return new FileStreamResult(new ModuleScriptProvider().GetFile("~/ModuleScript/" + path).Open(), "text/javascript"); 
    } 
} 

関連する問題