4

プリプロセッサ テンプレート内で、既存の部分ビューのロジックを動的な電子メール生成に再利用できるかどうか疑問に思っています。

T4ToolKit の IntelliSense オプションを調べると、

<#@ import namespace="System.Web.Mvc" #>

Mvcの名前空間が表示されません。名前空間を含めて呼び出すことは可能ですか

Html.RenderPartial("viewName", this.Model)

プリプロセッサ テンプレート内から?

すなわち

<#@ template language="C#" #>
This is a header
<#= Html.RenderPartial("<%PATH%>/MyPartialRazerView", this.Model) #>
This is a Footer
<#+
  public MyType Model { get; set; }
#>

そのため、プログラムでテンプレートにアクセスし、ビューの表示ロジックを再利用してビルドし、オンザフライで電子メールを送信できます (電子メールの行はナンセンスであり、簡単にするための省略形にすぎません)。

var template = MyTemplate(){ Model = MyViewModel };

Email.Send(emailAddress, title, template.TransformText(), null) etc..

ティア

4

1 に答える 1

0

これは確実に実行できますが、 とは異なる拡張メソッドを使用する必要がありますRenderPartial。これらは応答に直接書き込むためです。テンプレートで正常に動作Partialする を返す拡張メソッドを試しました。MvcHtmlStringこれは私のテスト T4 ランタイム テンプレート、RuntimeTextTemplate1.tt です。

<#@ template language="C#" #>
<#@ import namespace="System.Web.Mvc.Html" #>
LogOnPartial:
<#= Html.Partial("_LogOnPartial") #>

HtmlHelper次に、いくつかの ASP.NET MVC フープをジャンプして、実際のインスタンスをテンプレートに取得する必要もあります。

Htmlプロパティをテンプレートに追加してインスタンス化しHtmlHelper、コンストラクターを提供するために、部分クラスを作成しました。

public partial class RuntimeTextTemplate1
{
    public HtmlHelper Html
    {
        get;
        private set;
    }

    public RuntimeTextTemplate1(ViewContext viewContext, IViewDataContainer viewDataContainer)
    {
        Html = new HtmlHelper(viewContext, viewDataContainer);
    }
}

はとを作成するHtmlHelper必要があり、それらには別の依存関係があります。いくつかのダミー クラスを使用して、コントローラーから必要なものを提供しました。ViewContextIViewDataContainer

public class HomeController : Controller
{
    public ActionResult TemplateTest()
    {
        var viewContext = new ViewContext(ControllerContext, new DummyView(), ViewData, TempData, TextWriter.Null);
        var template = new RuntimeTextTemplate1(viewContext, new ControllerViewDataContainer(this));
        return Content(template.TransformText());
    }
}

public class DummyView : IView
{
    public void Render(ViewContext viewContext, TextWriter writer)
    {
        // Do nothing
    }
}

public class ControllerViewDataContainer : IViewDataContainer
{
    private Controller controller;

    public ViewDataDictionary ViewData
    {
        get { return controller.ViewData; }
        set { }
    }

    public ControllerViewDataContainer(Controller controller)
    {
        this.controller = controller;
    }
}

そして、テンプレート出力を正常に取得しました。

したがって、これを行うことはできますが、特定の状況、それをどの程度正確に使用する必要があるか、ビューをどのようにパラメーター化するか、HtmlHelperインスタンスに到達するために必要なクラスをどのように組み立てるかによって異なります。

最終的に、テンプレートを必要な出力の主要なソースにし、これをビュー内およびビュー外で使用する方が、その逆よりも簡単であることがわかる場合があります。

于 2013-04-04T14:33:23.453 に答える