46

Razor エンジンhttps://github.com/Antaris/RazorEngineを使用して、メール テンプレートの本文を解析しています。レイアウトを定義して他の .cshtml ファイルを含めることはできますか? たとえば、共通のヘッダーとフッターです。

4

4 に答える 4

55

次の 2 つの投稿の助けを借りて、共通のテンプレートとレイアウトが機能するようになりました。

RazorEngine 文字列のレイアウトとセクション?

http://blogs.msdn.com/b/hongyes/archive/2012/03/12/using-razor-template-engine-in-web-api-self-host-application.aspx

これが私の解決策です:

解決策 1: レイアウト

_Layout を設定して使用

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

フッター

@section Footer 
{
   @RenderPart("Footer.cshtml")
}

Layout.cshtml

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

TemplateBaseExtensions

RenderPart メソッドで TemplateBase を拡張する

public abstract class TemplateBaseExtensions<T> : TemplateBase<T>
{
    public string RenderPart(string templateName, object model = null)
    {
        string path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "Templates", templateName);
        return Razor.Parse(File.ReadAllText(path), model);
    }
}

Razor 構成

BaseTemplateType を TemplateBaseExtensions クラスに設定します

TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration
{
     BaseTemplateType = typeof(TemplateBaseExtensions<>)
};

Razor.SetTemplateService(new TemplateService(templateConfig));

ソリューション 2を編集します。

TemplateResolver を使用している場合。RenderPart は必要ありません。代わりに @Include を使用してください

フッター

@section Footer 
{
   @Include("Footer.cshtml")
}

リゾルバ

public class TemplateResolver : ITemplateResolver
{
    public string Resolve(string name)
    {
        if (name == null)
        {
            throw new ArgumentNullException("name");
        }

        string path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "Templates", name);
        return File.ReadAllText(path, System.Text.Encoding.Default);
    }
}

設定

TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration
{
     Resolver = new TemplateResolver()
};
Razor.SetTemplateService(new TemplateService(templateConfig));

The Muffin Man による更新 テンプレートを指定して文字列をレンダリングする

var templateResolver = Razor.Resolve("Registration.cshtml");
return templateResolver.Run(new ExecuteContext());

また、私は、このリンクhttps://github.com/Antaris/RazorEngine/issues/61_Layoutの他のユーザーと一緒に、使用中に問題が発生しLayoutました。

「_Layout」は古い構文です。今後のリリースで「レイアウト」に更新されました。

于 2012-08-03T15:39:09.057 に答える