当从ASP.NET Web API使用RazorEngine时,如何让@Url.Content()
在我的_Layout.cshtml
中工作?
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辅助方法。也许我需要一些从虚拟路径获取绝对路径的其他方法。看来我仍然需要一些方法来检查请求。
答案 0 :(得分:4)
实现此方法的一种方法是遵循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);
}
}
}
使用此TemplateBase<>
的扩展名设置TemplateService配置。
var config =
new RazorEngine.Configuration.TemplateServiceConfiguration
{
TemplateManager = new TemplateManager(),
BaseTemplateType = typeof(WebApiTemplateBase<>)
};