2013-10-12 4 views
2

Я хочу, чтобы получить строку Пучков строить в других среде, например: HttpApplication запуск, консольное приложение и т.д.Как использовать пакеты без HttpContext?

Но когда я называю

Scripts.Render("~/js").ToHtmlString() 

Будет бросить исключение:

Value cannot be null. 
Parameter name: httpContext 

Как насмехаться, чтобы получить результат?

+0

Можете ли вы включить стек вызовов? – nikmd23

ответ

1

Короткий ответ: Нет, нельзя использовать Scripts.Render без httpContext. Но может возникнуть обходное решение, если вы хотите издеваться над ним (см. Ниже).

Подробный ответ: Microsoft сделала некоторые неудачные проектные решения. Я декомпилировал метод Render библиотеки System.Web.Optimization (часть системы веб-оптимизации Microsoft.ASP.NET, доступной через NUGET) и нашел: Scrips.Render (который вызывает Scripts.RenderFormat внутренне) вызывает Scripts.Manager.RenderExplicit(tagFormat, paths), чтобы вернуть результат рендеринга.

Эта функция использует this.DeterminePathsToRender(paths) внутренне для разрешения путей с помощью this.ResolveVirtualPath(current). И если вы посмотрите на него, вы увидите, что он использует this._httpContext разрешить путь:

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. Еще один способ, которым я думал, - наследовать класс myScriptClass из класса Scripts, а затем установить внутреннее свойство Context через конструктор myScriptClass. Но это также невозможно, потому что Scripts - это статический класс, который вы не можете наследовать (подробнее см. this topic).


Но вы можете использовать BundleContext.HttpContext, чтобы получить или установить в настоящее время используется HttpContext.

Однако, если у вас есть доступ только к определенному объекту BundleCollection, то у вас нет возможности, так как его .Context свойство является внутренним.

Для консольного приложения это означает, что вам, возможно, придется создать объект поддельного запроса и HttpContext, который вы должны назначить BundleContext.HttpContext, прежде чем использовать метод визуализации. Вы можете посмотреть here или there, чтобы получить более подробную информацию, как это сделать.

Смежные вопросы