RazorEngine与@Html有关

Jam*_*art 32 razorengine

我正在使用RazorEngine来呈现一些基本内容(一个非常粗糙的内容管理系统).

它很有用,直到我将任何@Html语法包含到标记中.

如果标记包含@html,我会收到以下错误:

无法编译模板.当前上下文中不存在名称"Html"

这是呈现标记的视图:

@Model Models.ContentPage

@{
    ViewBag.Title = Model.MetaTitle;
    Layout = "~/Views/Shared/Templates/_" + Model.Layout + "Layout.cshtml";

}
@Html.Raw(RazorEngine.Razor.Parse(Model.Markup, Model))
Run Code Online (Sandbox Code Playgroud)

我在Codeplex网站上看到了RazorEngine使用@Html(我知道那里的版本已经过时了,我通过nuget得到了我的版本).

对此的任何帮助都会很棒.

Eve*_*req 30

检查https://github.com/Antaris/RazorEngine/wiki/6.-Encoding-Values页面.我在这里复制/过去:

默认情况下,RazorEngine配置为以HTML格式编码.当您希望输出按原样时,这有时会出现将某些字符编码为HTML的问题.

要以原始格式输出内容,请使用@Raw()内置方法,如以下示例所示:

string template = "@Raw(Model.Data)";
var model = new { Data = "My raw double quotes appears here \"hello!\"" };

string result = Razor.Parse(template, model);
Run Code Online (Sandbox Code Playgroud)

哪个应该导致:

My raw double quotes appears here "hello!"
Run Code Online (Sandbox Code Playgroud)


Mat*_*ott 19

HtmlUrl辅助性是MVC在他们看来引擎实现剃须刀的实际功能.开箱即用,Html并且Url在没有专门定制基本模板的情况下目前不支持.

即将推出的v3版本将附带一个相关的RazorEngine.Web版本,希望它包含一个MVC3兼容的基本模板HtmlUrl支持.

我在项目主页上编写的示例纯粹是使用自定义基本模板的示例.

您可以在https://github.com/Antaris/RazorEngine上找到有关v3的更多信息


mao*_*o47 12

这已经超过一年了,但由于我没有在互联网上的任何地方找到工作副本并且github页面处于非活动状态,我想我会分享我的实现,以便为RazorEngine添加@Html帮助器语法.这是我最终实现的实现,使用Abu Haider的实现作为起点.

感谢miketrash的评论:如果您尝试使用@ Html.Action(),则需要添加RequestContext(您可以使用HttpContext.Current.Request.RequestContext).我没有包含请求上下文,因为它并不总是可用于我的应用程序.

[RequireNamespaces("System.Web.Mvc.Html")]
public class HtmlTemplateBase<T>:TemplateBase<T>, IViewDataContainer
{
    private HtmlHelper<T> helper = null;
    private ViewDataDictionary viewdata = null;       

    public HtmlHelper<T> Html
    {
        get
        {
            if (helper == null) 
            {                  
                var writer = this.CurrentWriter; //TemplateBase.CurrentWriter
                var vcontext = new ViewContext() { Writer = writer, ViewData = this.ViewData};

                helper = new HtmlHelper<T>(vcontext, this);
            }
            return helper;
        }
    }

    public ViewDataDictionary ViewData
    {
        get
        {
            if (viewdata == null)
            {
                viewdata = new ViewDataDictionary();
                viewdata.TemplateInfo = new TemplateInfo() { HtmlFieldPrefix = string.Empty };

                if (this.Model != null)
                {
                    viewdata.Model = Model;
                }
            }
            return viewdata;
        }
        set
        {
            viewdata = value;
        }
    }

    public override void WriteTo(TextWriter writer, object value)
    {
        if (writer == null)
            throw new ArgumentNullException("writer");

        if (value == null) return;

        //try to cast to RazorEngine IEncodedString
        var encodedString = value as IEncodedString;
        if (encodedString != null)
        {
            writer.Write(encodedString);
        }
        else
        {
            //try to cast to IHtmlString (Could be returned by Mvc Html helper methods)
            var htmlString = value as IHtmlString;
            if (htmlString != null) writer.Write(htmlString.ToHtmlString());
            else
            {
                //default implementation is to convert to RazorEngine encoded string
                encodedString = TemplateService.EncodedStringFactory.CreateEncodedString(value);
                writer.Write(encodedString);
            }

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我还必须覆盖WriteTo方法TemplateBase,否则RazorEngine会对辅助方法的结果进行html编码,这意味着你将逃避'<','>'和引号(参见这个问题).覆盖添加了IHtmlString对执行编码之前的值的检查.

  • 对于来到这里试图弄清楚如何让Html.Action与RazorEngine一起工作的穷人,你需要添加RequestContext.`var context = new ViewContext(){RequestContext = HttpContext.Current.Request.RequestContext,Writer = writer,ViewData = this.ViewData};` (4认同)

Rob*_*ert 12

这是一个很老的问题,但我在coderwall找到了很好的答案.解决方案是使用:

@(new RawString("<strong>Bold!</strong>"))
Run Code Online (Sandbox Code Playgroud)

要不就:

@(new RawString(Model.YourHTMLStrinInModel))
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助.


Vic*_*ber 5

我很抱歉,我没有必要的50个声誉来添加评论,所以必须回答.

如果有人想知道(如JamesStuddart所示)缺少SetTemplateBase()方法,但您可以创建配置实例以使用基本模板初始化服务.

http://razorengine.codeplex.com/discussions/285937我改编了我的代码,看起来像:

var config = new RazorEngine.Configuration.TemplateServiceConfiguration
        {
            BaseTemplateType = typeof(MyHtmlTemplateBase<>)
        };

        using (var service = new RazorEngine.Templating.TemplateService(config))
        {
            // Use template service.
            Razor.SetTemplateService(service);
            result = Razor.Parse(templateString, model);
        }
Run Code Online (Sandbox Code Playgroud)