我使用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))我在Codeplex站点上看到了@ RazorEngine的使用(我知道那里的版本已经过时,我通过nuget获得了自己的版本)。
在这方面任何帮助都会很好。
发布于 2011-12-19 13:39:53
Html和Url助手属性是MVC在视图引擎中实现Razor的实际特性。如果没有定制的基本模板,Html和Url目前是不受支持的。
即将发布的v3将附带一个相关的RazorEngine.Web版本,有望包含一个具有Html和Url支持的MVC3兼容的基本模板。
我在项目主页上编写的示例纯粹是使用自定义基模板的一个示例。
您可以在https://github.com/Antaris/RazorEngine上了解更多关于https://github.com/Antaris/RazorEngine的信息。
发布于 2012-07-30 11:05:37
检查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);这将导致:
My raw double quotes appears here "hello!"发布于 2013-10-17 18:10:22
这已经有一年多的历史了,但是由于我还没有在互联网上找到一个工作副本,而且github页面是不活动的,我想我应该共享我的实现,以便将@ helper语法添加到RazorEngine中。下面是我最后的实现,使用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);
}
}
}
}我还必须重写TemplateBase的TemplateBase方法,因为否则RazorEngine将对helper方法的结果进行html编码,这意味着您将转义'<‘、'>’和引号(参见这个问题)。在执行编码之前,重写添加了对值为IHtmlString的检查。
https://stackoverflow.com/questions/8561164
复制相似问题