RazorEngine WebApiTemplateBase @Url.Content()

RazorEngine WebApiTemplateBase @Url.Content()

当从 ASP.NET Web API 使用 RazorEngine 时,如何让 @Url.Content() 在我的 _Layout.cshtml 中工作?

RazorEngine (v.3.7.2) 仅处理 Razor 语法,而不处理其他辅助方法,如 @Html@Url。这些可以通过扩展 TemplateBase<> 并在配置中设置来添加。

一些老问题中有代码示例:#26, #29; in an unreleased, incomplete piece of code in MvcTemplateBase.cs; and in the documentation for Extending the Template Syntax

我的问题是我使用的 ASP.NET Web API (v.1) 没有 HttpContext.Current(也不应该)。我想提供一个 UrlHelper,因为我想使用它的 Content() 方法,但它需要用 HttpRequestMessage 实例化,这将不可用。

可能无法为我的编译布局获取@Url 辅助方法。也许我需要一些其他方式从虚拟路径获取绝对路径。看来我仍然需要一些方法来检查请求。

实现此功能的一种方法是遵循 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<>)
    };