我想在其他环境中获取bundle的构建字符串,例如:HttpApplication start,Console application等。
但是当我打电话时
Scripts.Render("~/js").ToHtmlString()
将抛出异常:
Value cannot be null.
Parameter name: httpContext
如何模拟它以获得结果?
答案 0 :(得分:1)
简答:不,如果没有httpContext,则无法使用Scripts.Render
。但是,如果您愿意嘲笑它,可能会有一种解决方法(见下文)。
详细解答:
微软做出了一些不幸的设计决定。
我已经反编译了 System.Web.Optimization (V1.1.0.0)库(Microsoft.ASP.NET Web优化框架的一部分,通过NUGET提供)的Render方法,并找到了:{{ 1}}(在内部调用Scrips.Render
)调用Scripts.RenderFormat
以返回渲染结果。
该函数在内部使用Scripts.Manager.RenderExplicit(tagFormat, paths)
来使用this.DeterminePathsToRender(paths)
来解析路径。如果您看一下它,您会看到它使用this.ResolveVirtualPath(current)
来解析路径:
this._httpContext
所以遗憾的是,围绕httpContext无法解决问题。 我想到的另一种方法是从类Scripts继承一个类myScriptClass,然后通过myScriptClass构造函数设置内部属性Context。但这也是不可能的,因为Scripts是一个静态类,你无法继承(详见this topic)。
但是您可以使用internal string ResolveVirtualPath(string virtualPath)
{
Uri uri;
if (Uri.TryCreate(virtualPath, UriKind.Absolute, out uri))
{
return virtualPath;
}
string arg = "";
if (this._httpContext.Request != null)
{
arg = this._httpContext.Request.AppRelativeCurrentExecutionFilePath;
}
return this.ResolveUrlMethod(arg, virtualPath);
}
来获取或设置当前使用的HttpContext。
但是,如果您只能访问特定的 BundleContext.HttpContext
对象,那么您就没有选项,因为其 BundleCollection
属性是内部属性。
对于控制台应用程序,这意味着您可能必须创建一个假请求对象和HttpContext,在使用render方法之前必须将其分配给BundleContext.HttpContext。您可以查看 here 或 there 以获取有关如何执行此操作的更多详细信息。