1

也许我没有在正确的地方调用 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);
        }
4

1 回答 1

0

github 问题页面上的 powercat97 提供了解决此问题的解决方法。 https://github.com/Antaris/RazorEngine/issues/46

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

以 AccountController 为例(HtmlTemplateBase 来自RazorEngine 问题与@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 }); }
于 2013-12-13T11:19:31.600 回答