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 は、 @Htmlおよびhttp://www.haiders.net/post/HtmlTemplateBase.aspxに関する RazorEngine の問題に由来します):

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 に答える