我正在使用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
在Html和Url辅助性是MVC在他们看来引擎实现剃须刀的实际功能.开箱即用,Html并且Url在没有专门定制基本模板的情况下目前不支持.
即将推出的v3版本将附带一个相关的RazorEngine.Web版本,希望它包含一个MVC3兼容的基本模板Html和Url支持.
我在项目主页上编写的示例纯粹是使用自定义基本模板的示例.
您可以在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对执行编码之前的值的检查.
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)
我希望它有所帮助.
我很抱歉,我没有必要的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)
| 归档时间: |
|
| 查看次数: |
25237 次 |
| 最近记录: |