RazorEngine WebApiTemplateBase @Url.Content()

Bog*_*gin 2 asp.net-web-api razorengine

当从 ASP.NET Web API 使用 RazorEngine 时@Url.Content(),我如何开始工作_Layout.cshtml

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

一些老问题中有代码示例:#26 , #29;在MvcTemplateBase.cs 中未发布的、不完整的一段代码中;并在扩展模板语法的文档中。

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

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

Bog*_*gin 5

实现此功能的一种方法是遵循通过扩展模板语法设置的方向并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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用TemplateBase<>.

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