首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RazorEngine与@Html有关的问题

RazorEngine与@Html有关的问题
EN

Stack Overflow用户
提问于 2011-12-19 12:12:08
回答 8查看 29.8K关注 0票数 35

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

在我将@Html语法包含到标记中之前,它工作得很好。

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

无法编译模板。名称'Html‘在当前上下文中不存在

这是呈现标记的视图:

代码语言:javascript
复制
@Model Models.ContentPage

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

}
@Html.Raw(RazorEngine.Razor.Parse(Model.Markup, Model))

我在Codeplex站点上看到了@ RazorEngine的使用(我知道那里的版本已经过时,我通过nuget获得了自己的版本)。

在这方面任何帮助都会很好。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-12-19 13:39:53

HtmlUrl助手属性是MVC在视图引擎中实现Razor的实际特性。如果没有定制的基本模板,HtmlUrl目前是不受支持的。

即将发布的v3将附带一个相关的RazorEngine.Web版本,有望包含一个具有HtmlUrl支持的MVC3兼容的基本模板。

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

您可以在https://github.com/Antaris/RazorEngine上了解更多关于https://github.com/Antaris/RazorEngine的信息。

票数 19
EN

Stack Overflow用户

发布于 2012-07-30 11:05:37

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

默认情况下,RazorEngine被配置为将代码编码为HTML。这有时会出现一些问题,当您希望输出保持原样时,某些字符被编码为HTML。

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

代码语言:javascript
复制
string template = "@Raw(Model.Data)";
var model = new { Data = "My raw double quotes appears here \"hello!\"" };

string result = Razor.Parse(template, model);

这将导致:

代码语言:javascript
复制
My raw double quotes appears here "hello!"
票数 31
EN

Stack Overflow用户

发布于 2013-10-17 18:10:22

这已经有一年多的历史了,但是由于我还没有在互联网上找到一个工作副本,而且github页面是不活动的,我想我应该共享我的实现,以便将@ helper语法添加到RazorEngine中。下面是我最后的实现,使用Abu Haider的实施作为起点。

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

代码语言:javascript
复制
[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);
            }

        }
    }
}

我还必须重写TemplateBaseTemplateBase方法,因为否则RazorEngine将对helper方法的结果进行html编码,这意味着您将转义'<‘、'>’和引号(参见这个问题)。在执行编码之前,重写添加了对值为IHtmlString的检查。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8561164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档