2011-02-08 16 views
2

私は電子メール用に使用しているhtmlテンプレートを持っています。私はそれにモデルを渡し、それをレンダリングして文字列変数に戻したいと思います。ASP.NET MVCがcontrollerContextのないhtmlテンプレートにモデルを渡します

どうすればこの問題を解決できますか?私はasp.net mvcに付属のレンダリングを使用できると確信しています。

私はコントローラ内でこれをやりたいのですが、controllercontextオブジェクトを使用していません。

+1

私はかなり長い間このことをやろうとしてきました。私はあなたにできることを保証しますが、解決策は簡単ではなく、少し汚いと感じています。代わりに[NDjango](http://ndjango.org/index.php?title=NDjango_Home)や[DotLiquid](http://dotliquidmarkup.org/)を調べましたか? –

+0

好奇心で、コントローラの中でそれをやってみませんか? – Scott

+0

@Scott、Webサービスがメソッドをトリガして電子メールを送信する可能性があります。 –

答えて

1

@Mitch Rosenburgからのコメントを回答として使用してください:

私はDotLiquidテンプレートを使用しています。

0

自分で試したことはありませんが、Postalというライブラリがあり、自分のアプリで非常に似た機能を使用する予定です。

あなたは以下の方法でのようにそれを行うことができます
+0

ありがとうございました。しかし、私はボディをサービス層まで送りたいと思っています。 –

0

private string ViewToString(string viewName, object model) 
{ 
    if (string.IsNullOrEmpty(viewName)) 
     viewName = ControllerContext.RouteData.GetRequiredString("action"); 

    ViewData.Model = model; 

    using (StringWriter sw = new StringWriter()) 
    { 
     ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); 
     ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); 
     viewResult.View.Render(viewContext, sw); 

     return sw.GetStringBuilder().ToString(); 
    } 
} 

そして、あなたのアクションメソッドでは、モデルは、あなたがに送信するモデルであり、この

ViewToString("Index", model); 

のようにそれを使用することができますあなたの「テンプレート」

+0

コントローラーの外でこれをやりたかったとは思わなかった。 :D –

0

私は一度同じことをしなければなりませんでした.HttpWebRequestを使用してビューを「レンダリング」し、その結果を文字列として取り込みました。

このソリューションには、(認証Cookieの取得、カスタムURLセキュリティレイヤーの電源供給などの)その他の問題が多数あり、非効率的で不合理だと感じましたが、締め切りは期限です。

コードはこのようなものに見えた:

public string GetEmailBody(string url) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.Method = "GET"; 

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    Stream responseStream = response.GetResponseStream(); 
    StreamReader streamReader = new StreamReader(responseStream); 
    return streamReader.ReadToEnd(); 
} 

は、それが誰かに役立ちます願っています。

関連する問題