我正在使用Razor Engine从数据库中动态编译我的剃刀视图。现在我正在使用 Razor Engine 3.7.3 。我看到很少有关于如何阅读html帮助并编译它的帖子,但它是旧版本的razor引擎。
我已经阅读了ITemplateServiceConfiguration
,但我真的不明白它是如何工作的。
我的问题是,如何使用@Html(Html帮助程序),@ Url(Url Helper)和@section(如@Section Scripts,成功)运行编译()razorengine(v3.7.3)来自我的数据库的html内容中的@Section精选?
到目前为止我所做的事情。我试图实现我从另一篇文章中获得的代码。该代码适用于较旧版本的剃刀引擎。他建议我们创建自己的帮助类:
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;
}
}
}
在解析之前,我们需要设置我们的配置:
Razor.SetTemplateService(new TemplateService( new TemplateServiceConfiguration()
{
BaseTemplateType = typeof(RazorTemplateBase<>)
};
));
result = RazorEngine.Razor.Parse(templateText, model);
RazorUrlHelper没有问题,但RazorHtmlHelper无法正确读取这些代码,因为它已被弃用:
ITemplate template = RazorEngine.Razor.Resolve(viewName);
ExecuteContext ec = new ExecuteContext();
RawString result = new RawString(template.Run(ec));
以上代码来自this post
答案 0 :(得分:-1)
我不完全确定我的建议会直接解决您的问题。根据我的专业经验,尝试利用已弃用的课程并不会产生积极的结果。我个人不会尝试直接从数据库中呈现视图。如果我在你的位置利用MVC4的剃刀视图引擎,我将放弃你的方法,请按照这些步骤。
创建将这些模型变量作为参数的HTML Helper对象,并在Views / web.config文件中定义其名称空间。在这个例子中,我使用了命名空间System.Web.HtmlHelpers。如果不这样做,您将无法在视图中利用基本命名空间之外的任何自定义帮助程序。
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization"/>
<add namespace="System.Web.Routing" />
<add namespace="System.Web.HtmlHelpers" />
</namespaces>
</pages>
</system.web.webPages.razor>
如果以这种方式实现HTMLHelpers,那么您将使用访问数据的逻辑抽象出您的JIT编译代码(所有视图代码),并将结构化数据库数据转换为可查看的HTML。在上面提供的示例中,JIT将在运行时为您的视图编译大部分逻辑,这在性能方面非常昂贵。 MVC以这样的方式设计,以便您可以防止承担所有这些开销。如果您创建了预编译库中存在的强大HTML帮助程序,则可以使视图代码非常小而且简单。