Antaris/RazorEngine

@Html (HtmlHelper instance) cannot be resolved

Closed this issue · 3 comments

I am trying to call various @html helper methods and the template will not compile saying:

"Unable to compile template. The name 'Html' does not exist in the current context"

Use a very simple template like this:

string template = "@using System.Web.Mvc @Html.Raw("some html stuff")";
Razor.Parse(template);

I added an instance of HtmlHelper to ViewBag and accessed the .Raw() method through there, but it still HtmlEncodes the output.

Thanks,

Scott

Update:

The fuctionality for supporting the @html, @url and any other helpers for MVC needs to be added by creating your own ITemplate and ITemplate<> classes. See the MvcTemplateBase class in the Web folder.

In this class, you will need to implement properties that expose Html (HtmlHelper) and Url (UrlHelper) properties. These classes will have to be instantiated internally to this class.

UrlHelper - Can be obtained from the HttpContextWrapper.CurrentHandler

using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

HttpContextWrapper httpContextWrapper = new HttpContextWrapper(HttpContext.Current);
MvcHandler mvcHandler = httpContextWrapper.CurrentHandler as MvcHandler;
RequestContext requestContext = mvcHandler.RequestContext;
UrlHelper urlHelper = new UrlHelper(requestContext);

HtmlHelper - this is a bit more tricky, because you need a ViewContext

If you are writing a IViewEngine/IView, you will have the ViewContext in IView.Render....no problem. Otherwise, you won't have a ViewContext. Does anyone know a way to get ViewVContext through HttpContext or some other mechanism without writing a view engine and custom view?

RazorEngine class does not have a way to specify custom ITemplate classes

Currently, internally, only TemplateBase and TemplateBase<> are supported. So you can create a derived class, but you can't do anything with it. This needs to be added as an overload to the API.

I am adding all of this to my source code update (including a sample view engine and custom view).

Once I create the branch, hopefully this will be included in the main source code.

Scott

Scott, we are using the template base from http://www.haiders.net/post/HtmlTemplateBase.aspx in the V2 razorengine with an added url helper:

    public UrlHelper Url
    {
        get
        {
            if (urlhelper == null)
            {
                urlhelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
            }
            return urlhelper;
        }
    }

RazorEngine does support custom base template types, they are specified as part of the ITemplateServiceConfiguration type, namely DefaultTemplateServiceConfiguration, XmlTemplateServiceConfiguration, or FluentTemplateServiceConfiguration