1

このトピックに対処する同様の質問がいくつかあることは知っていますが、その答えには満足していません。

私が欲しいのは、レイアウトページと部分ビューで強く型付けされたビューを使用できるRazorViewエンジンを最大限に活用することです。ビューの上部でモデルを宣言し、そのモデルを渡すだけです。とても簡単!ビューに渡す直前に明示的に構築する必要のある動的モデルはありません。編集:これは、Webアプリケーションの外部、電子メールの本文を作成できるクラスライブラリの内部で行いたいと思います。これがここでの本当の問題は、WebアプリではないRazorViewEngineを利用することです。

この背後にある考え方は、User20個のプロパティを持つオブジェクトがあり、ウェルカムメールの最初のバージョンでは名前のみを使用しているが、後でテンプレートを編集してそのアドレスまたはアドレスCityを使用できるようにしたい場合です。コードを追加したり、再コンパイルして再デプロイしたりせずに、Razorビューを更新します。StateEmail

私はRazorEngineを見て、アイデアとシンプルさが大好きですが、すべてが動的なタイプです。ここでの私の問題は、データベースからモデルとしてデータをプルすることです。物事を動的タイプに押し込む必要があるため、ビューにすべてのプロパティを取得することはできません。

MvcMailerも表示されます。これも理論的には優れていますが、ビューに渡されるすべてのデータモデルが動的であり、強く型付けされていないという同じ問題があります。

私はこれの独自のバージョンを構築し始めました。これには、System.Web.Mvc、System.Web.Razor、System.Web.WebPagesなどのいくつかのWeb名前付けが必要になります-そして私はそれで大丈夫です。問題は、HttpContextとControllerContextとRouteDataの欠如です....私がモック/スタブしようとしているので。私は現在、DisplayModesを調査し、実際のWebコンテキストの外でこれらをモックする方法を見つけようとしています。

もっと良い方法はありますか?前述の2つのフレームワークのいずれかを提案する場合は、私の問題に注意し、回避策があるかどうかをお知らせください。

編集2: RazorEngineでもう少し遊んだ後、強く型付けされたモデルは必ずしも私が思っていたほどの問題ではありません。今のところ私が望んでいるのは、レイアウトページと部分ビューも使用できることです。置き換えられる文字列プレースホルダーを使用してこれをハックすることはできますが、おそらくあまり効率的ではなく、あまり柔軟ではありません。

4

4 に答える 4

4

コントローラのアクションメソッド内からこれを達成しようとしていると仮定すると、これを行う簡単な方法があります。

このメソッドは、強く型付けされたビューの出力を提供します。

public static string RenderViewToString(this Controller controller, string viewName, object model)
{
    controller.ViewData.Model = model;
    try
    {
        using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindView(controller.ControllerContext, viewName, null);
            ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
            viewResult.View.Render(viewContext, sw);
            viewResult.ViewEngine.ReleaseView(controller.ControllerContext, viewResult.View);

            return sw.ToString();
        }
    }
    catch(Exception ex)
    {
        return ex.ToString();
    }
}

次に、コントローラーメソッド内から、ビューとモデルの名前を使用してこのメ​​ソッドを呼び出すだけです。

public ActionResult Mail()
{
    // whatever you use to get your User object
    var model = new User();

    var output = this.RenderViewToString("~/Views/User/Email.cshtml", model)
}

これにより、関連するレイアウトを含む、強く型付けされたビューのレンダリングをシミュレートし、出力を文字列として収集して、電子メールで送信することができます。

于 2012-09-30T06:32:09.593 に答える
0

答えは、渡されたオブジェクトが動的であるかどうかは問題ではないように見えるということです。強く型付けされたオブジェクトを渡すことができ、動的にしたり動的オブジェクトを再構築したりしなくても、そのまま受け入れられます。

私の予備テストでは、これは問題なく機能するはずであることが示されています。

于 2012-10-17T00:54:22.487 に答える
0

Actionmailer.netを試してみてください:https ://bitbucket.org/swaj/actionmailer.net/wiki/Home

私はそれをかなりうまく使っています。

于 2013-01-20T04:59:49.460 に答える
0

RazorMachineをチェックしてください。RazorEngineに似ていますが、レイアウトで動作します。

于 2013-04-14T17:59:48.337 に答える