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