RazorEngine WebApiTemplateBase @ Url.Content()

时间:2015-09-08 14:55:30

标签: 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中未发布的,不完整的代码片段;以及Extending the Template Syntax的文档。

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

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

1 个答案:

答案 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<>)
    };