2009-03-04 14 views
3

私は確認メールをユーザーに送信するASP.NET MVCアプリケーションを開発しています。電子メール自体については、ビューを作成してそのビューをレンダリングし、.NETメールオブジェクトを使用して送信したいと考えています。オンザフライでビューをレンダリングする

どのようにMVCフレームワークを使用してこれを行うことができますか?

+0

を、私はあなたがMVC、ないMCV –

+0

は私が2行にタイプミスと同じ単語の両方を獲得したと信じていないことを意味だと思います! – Jonathan

答えて

2

リチャードの答えについて、このコードはうまくいきましたが、常に「HTTPヘッダーが送信された後にリダイレクトできません」というエラーが発生しました。

http://mikehadlow.blogspot.com/2008/06/mvc-framework-capturing-output-of-view_05.html

この男の方法は、自分自身を作成することです:

は、Googleの周りを掘りとイライラしているの多くした後、私は最終的に、この記事で、トリックを行うように見えるいくつかのコードを見つけましたHttpContext。

Rather than use the MVCContrib BlockRenderer I simply replace the current HttpContext with a new one that hosts a Response that writes to a StringWriter.

この方法は、(マイナーな違いは、私は私の部分図を描画するための別のアクションを作成しなければならなかったということではありませんが、そこにはドラマ)完璧に動作します。

3

基本的にIView.Renderを使用する必要があります。 ViewEngineCollection.FindView(デフォルトはViewEngines.Engines.FindView)を使用して表示されます。出力をTextWriterにレンダリングしてから、ViewEngine.ReleaseViewに電話してください。下記のサンプルコード(未テスト):

StringWriter output = new StringWriter(); 

string viewName = "Email"; 
string masterName = ""; 

ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, viewName, masterName); 

ViewContext viewContext = new ViewContext(ControllerContext, result.View, viewData, tempData); 
result.View.Render(viewContext, output); 

result.ViewEngine.ReleaseView(ControllerContext, result.View); 

string viewOutput = output.ToString(); 

私はviewData/tempDataをあなたに任せます。

+0

このメソッドは、「HTTPヘッダーが送信された後はリダイレクトできません」という点を除いて、一部の変更の後に機能しました。これは、独自のストリームではなく、共有されたResponseオブジェクトの下でHTTPヘッダーを送信することと関係がある(申し訳ありませんが、.NET HTTPオブジェクトについての私の理解はそれだけではありません)。 – Jonathan

+0

なぜリダイレクトするのですか? –

+1

実際にReleaseViewは何をしていますか?それは本当に重要ですか?もし私がそれを呼ぶことがないなら、どうしますか? – NightElfik

0

これが私の仕事:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Web; 
using System.Web.Mvc; 

namespace Profiteer.WebUI.Controllers 
{ 
    public class SampleController : Controller 
    { 
     public ActionResult Index() 
     { 
      RenderViewAsHtml(RouteData.Values["controller"].ToString(), 
          RouteData.Values["action"].ToString()); 
      return View(); 
     } 

     private void RenderViewAsHtml(string controllerName, string viewName) 
     { 
      var vEngine = (from ve in ViewEngineCollection 
          where ve.GetType() == typeof(RazorViewEngine) 
          select ve).FirstOrDefault(); 
      if (vEngine != null) 
      { 
       var view = 
        vEngine.FindView(
         ControllerContext, 
         viewName, "_Layout", false).View as RazorView; 
       if (view != null) 
       { 
        var outPath = 
         Server.MapPath(
          string.Format("~/Views/{0}/{1}.html", 
             controllerName, viewName)); 
        using (var sw = new StreamWriter(outPath, false)) 
        { 
         var viewContext = 
          new ViewContext(ControllerContext, 
              view, 
              new ViewDataDictionary(), 
              new TempDataDictionary(), 
              sw); 
         view.Render(viewContext, sw); 
        } 
       } 
      } 
     } 
    } 
} 
関連する問題