在Controller Action中调用RazorEngine.Parse()失败,错误的HttpContextBase

时间:2013-12-12 13:49:57

标签: asp.net-mvc razorengine

也许我没有在正确的地方调用RazorEngine。

在我的控制器操作中,我使用以下代码调用RazorEngine。但我认为这可能不正确,因为当它调用.Execute()然后进入MVC的GetActionCache()时,HttpContextBase.Items失败并带有“未实现的方法”异常。

我是以错误的方式调用RazorEngine吗? @ Html.LabelFor()工作正常。

string template = "@Html.EditorFor(model => model.OldPassword)";
string result = string.Empty;
        var config = new RazorEngine.Configuration.TemplateServiceConfiguration
        {
            BaseTemplateType = typeof(System.Web.Mvc.Helpers.HtmlTemplateBase<>)
        };

        using (var service = new RazorEngine.Templating.TemplateService(config))
        {
            // Use template service.
            RazorEngine.Razor.SetTemplateService(service);
            result = RazorEngine.Razor.Parse(template, model);
        }

1 个答案:

答案 0 :(得分:0)

在github问题页面上的

powercat97 over解决了这个问题的解决方法。 https://github.com/Antaris/RazorEngine/issues/46

我遇到很多麻烦的原因是没有设置上下文。创建新的ViewContext是不够的。 因此,通过调用一个视图,该视图又通过RenderAction()调用我们的RazorEngine代码,我们得到了上下文,并且MVC框架具有RazorEngine调用它所需的一切。

使用AccountController作为示例(HtmlTemplateBase来自RazorEngine issues with @Htmlhttp://www.haiders.net/post/HtmlTemplateBase.aspx):

public ActionResult Test()
{
    var model = new MySite.Models.LocalPasswordModel();
    model.OldPassword = "MyOldPwd";
    model.NewPassword = "SomeNewPwd";
    return PartialView(model);
}

[ChildActionOnly()]
    public string TestTemplate(MySite.Models.LocalPasswordModel vm)
    {
        string result = string.Empty;
        string template = "@Html.EditorFor(model => model.OldPassword)";
        var config = new RazorEngine.Configuration.TemplateServiceConfiguration
        {
            BaseTemplateType = typeof(HtmlTemplateBase<>)
        };

        using (var service = new RazorEngine.Templating.TemplateService(config))
        {
            // Use template service.
            RazorEngine.Razor.SetTemplateService(service);
            result = RazorEngine.Razor.Parse(template, vm, "MyTemplateName");
        }
        return result;
    }

并在Test.cshtml中:

@model TestRazorEngine.Models.LocalPasswordModel
@{ Html.RenderAction("TestTemplate", new { vm = Model }); }