2011-01-21 2 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); 
관련 문제