如何在VB.NET中获取Bundle的context值及遍历指定Bundle的文件列表
嘿,我来帮你搞定VB.NET里关于Bundle的这两个需求,这俩场景在日常开发中还挺常见的,下面分情况给你详细拆解:
1. 获取Bundle的"context"值
首先得明确:Bundle的Context属性是BundleContext类型,它主要在请求处理阶段(比如页面渲染@Scripts.Render的时候)才会被初始化赋值,注册Bundle的时候这个属性还是null哦。
如果是在请求上下文中(比如视图、控制器、自定义Bundle变换逻辑里),你可以这样获取:
' 第一步:先找到你要操作的目标Bundle Dim targetBundle = BundleTable.Bundles.GetBundleFor("~/bundles/example") ' 情况1:直接获取当前请求的BundleContext Dim currentContext = BundleContext.GetCurrent() ' 情况2:如果已经拿到Bundle实例,检查并访问它的Context(确保在请求阶段调用) If targetBundle IsNot Nothing AndAlso targetBundle.Context IsNot Nothing Then ' 可以访问Context里的各种属性,比如虚拟路径提供者 Dim virtualPathProvider = targetBundle.Context.VirtualPathProvider ' 或者获取当前HttpContext Dim httpContext = targetBundle.Context.HttpContext End If
要是你在Bundle注册代码里直接访问Context,大概率会拿到null,记得要等到请求触发Bundle解析的时候再用哦。
2. 遍历特定Bundle中的文件列表
这里分两种场景:一种是获取注册时添加的原始虚拟路径,另一种是获取解析后的实际文件信息,我分别给你示例代码:
场景A:获取解析后的实际文件(推荐)
用Bundle自带的EnumerateFiles方法,它会结合BundleContext帮你解析出所有实际存在的文件(包括IncludeDirectory添加的文件、排除的文件等):
' 先定位到目标Bundle Dim exampleBundle = BundleTable.Bundles.GetBundleFor("~/bundles/example") If exampleBundle IsNot Nothing Then ' 必须在请求上下文中获取BundleContext Dim context = BundleContext.GetCurrent() If context IsNot Nothing Then ' 遍历所有解析后的文件 For Each fileInfo In exampleBundle.EnumerateFiles(context) ' 文件的虚拟路径 Dim virtualPath = fileInfo.VirtualPath ' 转换成服务器物理路径 Dim physicalPath = context.HttpContext.Server.MapPath(virtualPath) Console.WriteLine($"虚拟路径: {virtualPath} | 物理路径: {physicalPath}") Next End If End If
场景B:获取注册时的原始路径列表
如果你只是想拿到当初用Include方法添加的路径,不想依赖框架内部的私有成员,最稳妥的方式是在注册Bundle时自己保存一份:
' 修改你的BundleConfig类,添加一个静态列表保存路径 Imports System.Web.Optimization Public Class BundleConfig ' 静态列表存储example bundle的原始路径 Public Shared ExampleBundleOriginalPaths As List(Of String) = New List(Of String)() Public Shared Sub RegisterBundles(ByRef bundles As BundleCollection) Dim bundlePaths = {"~/Scripts/file1.js", "~/Scripts/file2.js"} Dim exampleBundle = New ScriptBundle("~/bundles/example").Include(bundlePaths) ' 保存原始路径 ExampleBundleOriginalPaths.AddRange(bundlePaths) bundles.Add(exampleBundle) End Sub End Class ' 之后在其他地方直接调用即可 For Each path In BundleConfig.ExampleBundleOriginalPaths Console.WriteLine("注册时添加的路径: " & path) Next
不推荐用反射去访问Bundle的私有字段(比如_includedPaths),因为框架版本更新后可能会失效,自己保存路径的方式更可靠。
内容的提问来源于stack exchange,提问作者Drew
相关产品推荐
相关产品推荐

