2015-09-08 3 views
1

Как я могу получить @Url.Content(), работающий в моем _Layout.cshtml, когда RazorEngine используется из веб-API ASP.NET?RazorEngine WebApiTemplateBase @ Url.Content()

RazorEngine (v.3.7.2) касается только синтаксиса Razor, а не дополнительных вспомогательных методов, таких как @Html или @Url. Их можно добавить, расширив TemplateBase<> и установив его в конфигурации.

В некоторых старых номерах есть примеры кода: #26, #29; в неизданной, неполной части кода в MvcTemplateBase.cs; и в документации для Extending the Template Syntax.

Моя проблема в том, что я использую ASP.NET Web API (v.1), который не будет иметь HttpContext.Current (и не должен). Я хочу предоставить UrlHelper, поскольку я хочу использовать его метод Content(), но его необходимо создать с помощью HttpRequestMessage, который будет недоступен.

Возможно, нет способа получить вспомогательные методы @Url для моего скомпилированного макета. Возможно, мне нужен другой способ получить абсолютный путь от виртуального пути. Кажется, мне все равно нужен какой-то способ проверки запроса.

ответ

3

Способ получения этой работы - следовать направлению, заданному Extending the Template Syntax, и использовать VirtualPathUtility.ToAbsolute() в вспомогательном методе.

using System.Web; 
using RazorEngine.Templating; 

namespace MyNamespace.Web 
{ 
    public abstract class WebApiTemplateBase<T> : TemplateBase<T> 
    { 
     protected WebApiTemplateBase() 
     { 
      Url = new UrlHelper(); 
     } 

     public UrlHelper Url; 
    } 

    public class UrlHelper 
    { 
     public string Content(string content) 
     { 
      return VirtualPathUtility.ToAbsolute(content); 
     } 
    } 
} 

Настройка конфигурации TemplateService с этим расширением TemplateBase<>.

var config = 
    new RazorEngine.Configuration.TemplateServiceConfiguration 
    { 
     TemplateManager = new TemplateManager(), 
     BaseTemplateType = typeof(WebApiTemplateBase<>) 
    };