2011-01-21 4 views
0

ニュースレターでは、Webページの最後の本文を生成して電子メールの本文に取り込みます。私はHttpWebRequestでこれを行う方法を見つけました。生成されたHTMLをプログラムによってHttpWebRequestと対比して返します。

private string GetHtmlBody(Guid id) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(String.Format("http://news.domain.com/News/View/{0}", id.ToString())); 
     HttpWebResponse responce = (HttpWebResponse)request.GetResponse(); 
     System.IO.StreamReader sr = new System.IO.StreamReader(responce.GetResponseStream()); 

     return sr.ReadToEnd(); 
    } 

しかし、私は良い方法があると感じています。 Web呼び出しをせずに、生成されたビューをどうにか取得できますか?

答えて

0

は最後に作業溶液を得ました。適切な検索条件を見つけた後(@ダーリンのおかげで)、多くの多くの試行が行われます。found a solution that works。これを私のコントローラーに入れて、レンダリングした文字列を私のEmailHelperに渡すと、私が必要としていたことにはうってつけです。

0

電子メールコードがWebサイトと同じプロジェクトにあるとすると、アクションメソッドを呼び出し、ActionResultを取得してからExecuteResultメソッドを呼び出すことができます。欠点は、このようにするには、ExecuteResultが利用できるストリームに書き込むように設定する必要があることです。このすべてを行うには、ControllerContextで使用されているクラスのいくつかをモックアップする必要があります。

XSLT変換によって生成されるマークアップを持つことは、おそらくもっと良い方法でしょう。 XSLTは、目的の結果を得るためにデータを保持するXML文書とマージできるXML文書テンプレートの一種です。これを行うと、電子メールを送信して変換を実行し、Webサイトで変換を実行するプロセスを持つことができます。これの利点は、マークアップが異なる(つまり、ニュースレターを再設計する)場合は、XSLTファイルを更新して展開するだけです。

HTH

1

あなたはMVCContrib for this taskを使用することができます。

またはいくつかの醜いコードをロールバックしよう:

public static string ViewToString(string controlName, object viewData) 
{ 
    var vd = new ViewDataDictionary(viewData); 
    var vp = new ViewPage { ViewData = vd }; 
    var control = vp.LoadControl(controlName); 
    vp.Controls.Add(control); 
    var sb = new StringBuilder(); 
    using (var sw = new StringWriter(sb)) 
    using (HtmlTextWriter tw = new HtmlTextWriter(sw)) 
    { 
     vp.RenderControl(tw); 
    } 
    return sb.ToString(); 
} 

、その後:

var viewModel = ... 
string template = ViewToString("~/Emails/EmailTemplate.ascx", viewModel); 
関連する問題