在控制器操作中调用RazorEngine.Parse()失败,HttpContextBase错误



也许我没有正确调用RazorEngine。

在我的控制器操作中,我使用以下代码来调用RazorEngine。但我认为这可能不正确,因为当它调用.Execute(),然后调用MVC的GetActionCache()时,HttpContextBase.Items会失败,并出现"methodnot implemented"异常。

我打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);
        }
github问题页面上的

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

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

以AccountController为例(HtmlTemplateBase来自RazorEngine与@Html和http://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 }); }

最新更新