2013-02-12 42 views
5

मेरे पास आईआईएस पर वर्चुअल निर्देशिका है जिसमें सभी जावास्क्रिप्ट और सीएसएस फ़ाइलें शामिल हैं। क्या उन फ़ाइलों को Bundles का उपयोग करके ASP.NET MVC ऐप में शामिल करना संभव है।पूर्ण पथ के साथ एएसपी.नेट एमवीसी बंडल

मैं पहले से ही कुछ इस तरह की कोशिश की है:

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

/सार्वजनिक/जावास्क्रिप्ट आईआईएस पर वर्चुअल निर्देशिका है:

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

लेकिन त्रुटि मिली।

+0

क्या आप एमवीसी 3 या 4 का उपयोग कर रहे हैं? आप दो बार टैग क्यों करते हैं? –

+0

मैं भी इसे ढूंढ रहा हूं। लेकिन मुझे डर है कि एमवीसी बंडल ~/public/javascript/foo.js जैसे अनुप्रयोग सापेक्ष पथ को छोड़कर कुछ भी समर्थन नहीं करता है – oruchreis

उत्तर

4

असल में बंडल वर्ग पूर्ण पथ का समर्थन नहीं करता है। मैंने a feature request here.

खोला है मैंने इस समस्या को कस्टम वर्चुअलपाथप्रोवाइडर और नियंत्रक के साथ हल कर लिया है। लेकिन यह बहुत नाजुक कार्यान्वयन है। आप जो भी चाहते हैं उसे संशोधित कर सकते हैं।

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

नियंत्रक:

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

Global.asax Application_Start विधि में:

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

भगवान गति।