10

私の小さなプロジェクトで RazorEngine を使用しようとしましたが、テンプレート レイアウトを使用しようとすると、このエラーを回避できません。

テンプレートをコンパイルできません。'object' には 'Description' の定義が含まれておらず、タイプ 'object' の最初の引数を受け入れる拡張メソッド 'Description' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)

私のセットアップ: 次のようなテンプレート レイアウトがあります。

<html>
<head>
    <title>@Model.Description</title>
</head>
<body>
    @RenderBody()
</body>
</html>

次に、次のようなページ テンプレートを作成します。

@{
    _Layout = "Layout.cshtml";
}
<h1>@Model.Description</h1>

これは、これを試して理解するために使用しているテスト Main 関数です。

    static void Main(string[] args)
    {
        // Configuration for RazorEngine
        var config = new TemplateServiceConfiguration
        {
            EncodedStringFactory = new RawStringFactory(),

            Resolver = new DelegateTemplateResolver(name =>
            {
                var file = name;
                var content = File.ReadAllText("Templates/" + file);
                return content;
            })
        };

        // Try to render output using Razor
        using (var service = new TemplateService(config))
        {
            string template = File.ReadAllText("Templates/Default.cshtml");

            dynamic model = new ExpandoObject();
            model.Description = "This is a test";
            string result = service.Parse(template, model);
            Console.WriteLine(result);
            if (Debugger.IsAttached)
            {
                Console.ReadLine();
            }

        }
    }

私が見逃しているものはありますか?

更新:動的モデル オブジェクトを説明プロパティを持つ POCO に置き換えると機能します。型付きバージョンの Parse も試しました

動的

ExpandoObject、およびIDictionary<string, object>しかし、それらはすべて同じエラーがあります。

更新: Github でこのプロジェクトを見つけたので、何とか機能するようです: https://github.com/mikoskinen/graze/blob/master/src/core/Graze.cs#L174

4

3 に答える 3

4

匿名型は内部としてコンパイルされるため、匿名型を動的に型指定されたビューに渡すことはできません。CSHTML ビューは別のアセンブリにコンパイルされるため、匿名型のプロパティにアクセスできません。

于 2012-11-22T19:04:36.460 に答える
2

上記のようにモデルを作成します

Index テンプレートで、ViewBag.Description を Model.Description に設定します。

@{
    _Layout = "Layout.cshtml";
    ViewBag.Description = Model.Description;
}

<div>Hello John </div>

レイアウト ページでは、モデルの代わりにビューバッグを使用します

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <head>
        <title>@ViewBag.Description</title>
    </head>
    <body>
        <div id="content">
            @RenderBody()
        </div> 
        @if (IsSectionDefined("Footer"))
        { 
            <div id="footer">
                @RenderSection("Footer")
            </div>
        }
    </body>
</html>

レイアウト ページで動的モデルを使用できない理由がわかりません。これが私のプロジェクトでの使用方法です

于 2012-11-23T16:40:53.480 に答える