2013-02-12 38 views
5

Tôi có thư mục ảo trên IIS chứa tất cả các tệp javascript và css. Có thể đưa các tệp đó vào ứng dụng ASP.NET MVC bằng Gói không.ASP.NET MVC Bundle với đường dẫn tuyệt đối

Tôi đã thử một cái gì đó như thế này:

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

nhưng đã nhận lỗi:

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

/public/javascript là thư mục ảo trên IIS.

+0

Bạn đang sử dụng MVC3 hoặc 4? Tại sao bạn gắn thẻ hai lần? –

+0

Tôi cũng đang tìm kiếm điều này. Nhưng tôi sợ rằng gói MVC không hỗ trợ bất cứ điều gì ngoại trừ các đường dẫn tương đối của ứng dụng như ~/public/javascript/foo.js – oruchreis

Trả lời

4

Thực ra, lớp Bundle không hỗ trợ đường dẫn tuyệt đối. Tôi đã mở a feature request here.

Tôi đã giải quyết vấn đề này với VirtualPathProvider tùy chỉnh và bộ điều khiển. Nhưng nó thực hiện rất mong manh. Bạn có thể sửa đổi cho đến nay như những gì bạn cần.

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); 
    } 
} 

Bộ điều khiển:

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

Trong Global.asax Application_Start phương pháp:

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

Thiên Chúa tốc độ.

Các vấn đề liên quan