Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RazorEngine - Use Layout and Html.Raw

I'd like to use the following Razor template with RazorEngine:

@{
    Layout = null;
}

@Html.Raw(MyNamespace.MyClass.SomePropertyWithHtml)

When I call it I get 2 errors - one complaining it can't handle Layout, and another complaining it doesn't know how to deal with the Html helper.

There are other questions and answers here suggesting this is possible in v3, and I'm using the current package on NuGet - v3.0.8 - but it isn't clear how this is done. Currently I'm calling it like so:

string html = RazorEngine.Razor.Parse(File.ReadAllText(path));

Other answers suggest using Razor.SetBaseTemplate first, which does not appear in current source or the 3.0 branch on git. Looking at the code I see code referencing layouts and sections, but the layout code appears to depend on resolving a template by name, while what I'm trying to do doesn't even need to resolve a template - I just need it to cope with the Layout = null. The code also includes a MvcTemplateBase that appears to offer an HtmlHelper in the Web project - but it's the sole class in that project and not referenced anywhere in the Web or Core projects.

This similar question: RazorEngine issues with @Html

Just links to the homepage saying you can find out more there - the homepage is just a short sentence describing the project.

So, how do I parse the above Razor view with RazorEngine v3.0?

like image 301
Chris Moschini Avatar asked May 03 '12 10:05

Chris Moschini


People also ask

Why not use Html Raw?

Raw can result in a XSS vulnerability being exploitable since an attacker can craft a special URL containing a malicious JavaScript payload that will be executed by the victim's browser if he or she sends an invalid 2FA confirmation code.

Can we use Html Raw?

The Html. Raw Helper Method is used to display HTML in Raw format i.e. without encoding in ASP.Net MVC Razor. In this article I will explain with an example, how to use Html.

Why we use Html raw in MVC?

I use the Html. Raw to print a raw html content, for example when I send some thing like ViewBag. div = "<div> Hello </div>"; from the controller to the view side it does not print a raw html content unless I use the Html.


1 Answers

The Layout property and the Html helper are not a part of TemplateBase, and the implementation of MvcTemplateBase that is a part of the latest version of RazorEngine (v3.4.1) appears incomplete (InitHelpers doesn't seem to initialize the helpers?). You'll need to create your own base template that implements these features.

As you noted, v3+ versions do not include a Razor.SetBaseTemplate method. You can set a base template type in the current version like so:

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

using (var service = new RazorEngine.Templating.TemplateService(config))
{
    Razor.SetTemplateService(service);
    return MvcHtmlString.Create(Razor.Parse<TModel>(templateText, model));
}

Should you need to initialize helpers, it may be helpful to override CreateInstance in a custom implementation of IActivator, which can be provided to the TemplateServiceConfiguration like the BaseTemplateType:

var config = new RazorEngine.Configuration.TemplateServiceConfiguration
    {
        BaseTemplateType = typeof(MyTemplateBase<>),
        Activator = new MyActivator()
    };
like image 96
jdmcnair Avatar answered Sep 20 '22 09:09

jdmcnair