2011-01-21 47 views
0

對於我們的通訊,我在網頁中生成電子郵件的最後一部分,然後將其放入電子郵件的正文中。我找到了一種方法來處理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(); 
    } 

不過,我覺得還有更好的辦法。我可以以某種方式拉動生成的視圖,而無需撥打網絡電話?

回答

0

終於得到了有效的解決方案。找到了一些合適的搜索條件(感謝@Darin)後,我有許多很多的試驗,我found a solution that works。把它放在我的控制器中,然後將渲染後的字符串傳遞給我的EmailHelper對我所需要的非常有用。

0

假設電子郵件代碼與網站位於同一個項目中,那麼您應該能夠調用操作方法,獲取ActionResult,然後調用ExecuteResult方法。缺點是爲了這樣做,您需要進行設置,以便ExecuteResult將寫入您可以利用的流。爲了完成所有這些,您需要模擬ControllerContext所使用的一些類。

什麼可能是更好的方法(儘管可能需要更多的工作),就是讓你想要通過XSLT轉換生成標記。 XSLT是一種XML文檔模板,可以與保存數據以產生所需結果的XML文檔合併。如果你這樣做,那麼你可以讓你的流程發送電子郵件運行轉換,並讓你的網站運行轉換。這樣做的好處是,如果您希望標記不同(即您正在重新設計新聞通訊),則只需更新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);