在RazorEngine中使用-State(没有来自MVC的HtmlHelper)

时间:2013-08-04 20:00:37

标签: .net razorengine

我在没有MVC-Framework的情况下使用RazorEngine。 这意味着我没有用于创建模板的HtmlHelper。

没关系,我不需要任何方法。 但是我需要创建自己的方法,比如BeginForm。

现在这些是用HtmlHelper.ViewContext.Writer.Write完成的,我没有。 是否有“开箱即用”的方式,或者我必须在这里做一些魔术吗?

2 个答案:

答案 0 :(得分:12)

RazorEngine旨在推导您自己的类型,以便在引擎本身中使用。

首先创建自己的助手:

public class RazorHtmlHelper
{
    public IEncodedString Partial(string viewName)
    {
        ITemplate template = RazorEngine.Razor.Resolve(viewName);

        ExecuteContext ec = new ExecuteContext();

        RawString result = new RawString(template.Run(ec));

        return result;
    }
}

public class RazorUrlHelper
{
    public string Encode(string url)
    {
        return System.Uri.EscapeUriString(url);
    }
}

接下来创建自己的模板:

public class RazorTemplateBase<T> : TemplateBase<T>
{
    private RazorUrlHelper _urlHelper = new RazorUrlHelper();

    private RazorHtmlHelper _htmlHelper = new RazorHtmlHelper();

    public RazorUrlHelper Url
    {
        get
        {
            return this._urlHelper;
        }
    }

    public RazorHtmlHelper Html
    {
        get
        {
            return this._htmlHelper;
        }
    }
}

在解析之前设置TemplateServiceConfiguration:

Razor.SetTemplateService(new TemplateService(
  new TemplateServiceConfiguration()
  {
    BaseTemplateType = typeof(RazorTemplateBase<>)
  };
));

result = RazorEngine.Razor.Parse(templateText, model);

现在,RazorEngine在视图中提供了@Html.Partial()@Url.Encode()

答案 1 :(得分:0)

一个更简单的解决方法(现在)是在顶部添加以下内容:

@using RazorEngine.Text

然后在您的模板中使用:

@(new RawString(Model.RawHtmlContents))

@(new RawString("<h3>This is custom <b>HTMLM/b></h3>"))
相关问题