2010-03-19 4 views
4

안녕하세요, 저는 여기에 악몽을 꾸미고 있습니다!출력 asp.net masterpage webform을 html 전자 메일로

저는 page.rendercontrol과 htmltextwriter를 사용하여 html로 웹 양식을 출력하려고했지만 이메일이 비어 있습니다.

코드 :

StringBuilder sb = new StringBuilder(); 
    StringWriter sw = new StringWriter(sb); 
    HtmlTextWriter htmlTW = new HtmlTextWriter(sw); 

    page.RenderControl(htmlTW); 

    String content = sb.ToString(); 

    MailMessage mail = new MailMessage(); 

    mail.From = new MailAddress("[email protected]"); 
    mail.To.Add("[email protected]"); 
    mail.IsBodyHtml = true; 

    mail.Subject = "Test"; 
    mail.Body = content; 

    SmtpClient smtp = new SmtpClient("1111"); 
    smtp.Send(mail); 

    Response.Write("Message Sent"); 

가 나는 또한 하나의 텍스트 상자를 렌더링하여 노력하고있어 및 오류 그것은합니다 (masterpage에있는) 양식 태그 내에있을 필요 말.

I는이 수정 시도 : http://forums.asp.net/p/1016960/1368933.aspx#1368933 및 부가 :

public override void 

VerifyRenderingInServerForm (컨트롤 제어) { 창; }

하지만 지금 내가 얻을 errror은 다음과 같습니다

VerifyRenderingInServerForm (제어) '더 적합한 방법은

사람이에 대한 수정이 있습니까 재정의 발견? 나는 머리를 찢어 버리고있어 !!

감사합니다,

스티브

+0

페이지 수명주기의 어떤 부분을 코드라고 부릅니까? 나는'Page' 속성이 대문자 "P"를 가져야하므로 소문자의'page'가 오타라고 가정하고 Page_Load의 페이지를 통해 디버깅하면 문자열 작성기가 전체 HTML로 채워지지만 그 페이지는 출력으로 아무 것도하지 않을 때 여러 폼 요소가있는 것에 대한 오류. –

답변

4

이 내가 VB에서, 할 것입니다 :

Dim sw as New StringWriter() 
Dim writer as New HtmlTextWriter(sw) 
System.Web.HttpContext.Current.Server.Execute("YourPage.aspx", writer) 
Dim message as String = sw.ToString() 
+0

도움 주셔서 감사합니다. 이 방법을 시도했지만 작동하지 못했습니다. 그것은 루프에 들어가서 동일한 텍스트를 반복해서 출력합니다. –

+0

이 코드는 렌더링하려는 페이지에서 호출되지 않지만 코드의 다른 위치, 일반적으로 비즈니스 계층에서 호출됩니다. – Barry

+2

이것은 imho에게 올바른 방법입니다. –

1

당신은 당신이 페이지의 내용을 렌더링 한 후, 페이지를 리디렉션 할 필요가없는 경우 (코드 샘플에서 필요없는 것처럼 보이지 않습니다), Response.Filter를 사용할 수 있습니다. 내 머리 위로 떨어져

, 그것과 같이 보일 것이다 :

protected void Page_Load(object sender, System.EventArgs e) 
{ 
    Response.Filter = new SmtpFilter(Response.Filter); 
} 

SmtpFilter 클래스를 바로 Stream 개체에서 상속 클래스입니다.

주된 방법은 쓰기 방법입니다. 여기 Write (...) 메소드를 재정의하고 Smtp 메일을 보내고 처리를 계속하기 위해 내 머리 꼭대기에서 벗어나는 코드가 있습니다. 당신이 Response.Filters에 더 많은 도움이 필요하면

public override void Write(byte[] buffer, int offset, int count) { 
    // get the html 
    string content= System.Text.Encoding.UTF8.GetString(buffer, offset, count); 

    MailMessage mail = new MailMessage(); 

    mail.From = new MailAddress("[email protected]"); 
    mail.To.Add("[email protected]"); 
    mail.IsBodyHtml = true; 

    mail.Subject = "Test"; 
    mail.Body = content; 

    SmtpClient smtp = new SmtpClient("1111"); 
    smtp.Send(mail); 


    buffer = System.Text.Encoding.UTF8.GetBytes(HTML); 
    this.Base.Write(buffer, 0, buffer.Length);  
    } 

, 당신은 그것을 구글 할 수 있습니다.

private string HtmlPageInToString() 
{ 
WebRequest myRequest; 
myRequest = WebRequest.Create(@"http://yoururlhere/"); 

myRequest.UseDefaultCredentials = true; 

WebResponse myResponse = myRequest.GetResponse(); 

Stream ReceiveStream = myResponse.GetResponseStream(); 
Encoding encode = System.Text.Encoding.GetEncoding("utf-8"); 

StreamReader readStream = new StreamReader(ReceiveStream, encode); 

return readStream.ReadToEnd(); 
} 

이 당신의 웹 양식을 채울 것입니다

http://aspnetlibrary.com/articledetails.aspx?article=Use-Response.Filter-to-intercept-your-HTML

+0

안녕하세요,이 답변을 많이 주셔서 감사합니다. 그것은 내가 필요한 것 같습니다. 양식에 입력 한 사용자가 입력 한 값을 출력합니까? 나는 이것을 월요일에 시험해보고 내가 어떻게 일어나는지 알려 줄 것이다. –

+0

양식이 다시 게시 된 경우 예. 이것은 응답 파이프 라인의 마지막 단계 중 하나이므로 브라우저에 전송되는 내용을 얻을 수 있습니다 (javascript 및 all - 따라서 이메일에서 스크립트를 제거해야합니다). –

+0

좋아, 나는 이것을 시도하고 smtpfilter가 존재하지 않는다는 오류를 받는다. 또한 'Base'에 대한 정의가 없습니다. 어떤 아이디어입니까? –

0

이 내가 이메일에 내 웹 양식을 밀어 넣는 데 사용하는 방법입니다 : 내가 찾은 첫 번째 기사는 도움이 여전히 VB.NET에했지만, 당신이 원한 방법을 사용하기위한 문자열로. 가장 좋은 점은 전체 페이지에서 끌어 내려서 포함되지 않은 마스터 페이지의 태그에 대해 걱정할 필요가 없다는 것입니다.

public class ViewManager { 
    public static string RenderView(string path, object data) { 
      Page pageHolder = new Page(); 
      UserControl viewControl = (UserControl) pageHolder.LoadControl(path); 

      if (data != null) { 
        Type viewControlType = viewControl.GetType(); 
        FieldInfo field = viewControlType.GetField("Data"); 
        if (field != null) { 
          field.SetValue(viewControl, data); 
        } 
        else { 
          throw new Exception("ViewFile: " + path + "has no data property"); 
        } 
      } 

      pageHolder.Controls.Add(viewControl); 
      StringWriter result = new StringWriter(); 
      HttpContext.Current.Server.Execute(pageHolder, result, false); 
      return result.ToString(); 
} 

이 코드는 컨트롤의 모든 정상 이벤트를 발생 : 다음 코드를 사용하여 문자열에 사용자 제어 출력을 사용자 컨트롤이 작업을 수행 한 다음 렌더링 할 수처럼 날이으로

+0

이 시도했지만 텍스트 상자에 입력 한 값이 손실됩니다. –

+0

그리고 텍스트 상자의 입력을 어디에도 저장하지 않습니까? – kaelle

0

소리 게시 된 양식 데이터를 컨트롤의 Data 속성을 통해로드 할 수 있습니다.

이 코드는 Scott Guthries blog post here에서 해제되었습니다.

감사

예스퍼 Hauge 그래서

1

나는이 고민하고 마침내 해답을 발견했다 ... 나는의 GridView의 렌더링 된 HTML을 추출하여 이메일에 배치하려고했다

. 페이지에서 해당 동작이 일어날 때 완벽하게 작동했지만 사용자 정의 컨트롤로 기능을 옮겼을 때 VerifyRenderingInServerForm 메서드는 Control 메서드가 아닌 Page 메서드이기 때문에 더 이상 작동하지 않습니다.

이 문제를 해결하려면 Render 메서드를 재정의하고 페이지를 호출하여 컨트롤이 runat = server 태그가있는 폼으로 렌더링되도록해야합니다. 여기에 수정 ...

이다
protected override void Render(HtmlTextWriter writer) 
{ 
    if (Page != null) 
    { 
     Page.VerifyRenderingInServerForm(this); 
    } 
    base.Render(writer); 
} 

그게 바로 거기에 시간을 낭비 시간,하지만 마침내!

+0

좋아, 나는 너무 일찍 말했다.내 세션이 버려지고 실제로 문제가 발생했습니다. 그러나 나는 그것을 실제로 고쳤다. 방금 컨트롤이 배치 된 페이지에 VerifyRenderingInServerForm 메서드를 넣었습니다. perminantly 메서드를 종료하십시오. 내가 왜 그렇게 생각하지 않았는지 모르겠다. –

관련 문제