2013-01-21 48 views
0

我需要發送在郵件中使用中繼器獲得的表,是否有關於如何將中繼器嵌入郵件正文中的示例?我正在使用MailMessage發送郵件。我試圖實現這個例子:在電子郵件中發送中繼器

System.IO.StringWriter stringWrite = new System.IO.StringWriter(); 

    System.Web.UI.HtmlTextWriter htmlWrite = 
    new HtmlTextWriter(stringWrite); 

    MyRepeater.RenderControl(htmlWrite); 

    string emailContent = stringWrite.ToString(); 

,但有一個錯誤:

Control ''m_repeater_btn" of type 'LinkButton' must be placed inside a form tag with runat=server. 

即使我把標籤的形式我得到仍出現錯誤,我應該如何把它?

這是我的asp.net頁面:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="ViewMySisters.aspx.cs" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <asp:Repeater ID="MyRepeater" runat="server"> 

    <HeaderTemplate> 
     <table style="border-collapse:collapse; border:1px solid grey;" width="500"> 
      <tr> 
       <td style="border: 1px solid grey;">firstname</td> 
       <td style="border: 1px solid grey;">lastname</td> 
       <td style="border: 1px solid grey;">age</td> 
    <td style="border: 1px solid grey;">work experienes</td> 

      </tr> 
    </HeaderTemplate> 

    <ItemTemplate> 
     <tr> 
      <td style="border: 1px solid grey;"><%# DataBinder.Eval(Container.DataItem, "NAME")%></td> 
      <td style="border: 1px solid grey;"><%# DataBinder.Eval(Container.DataItem, "FAMILY   NAME")%></td> 
      <td style="border: 1px solid grey;"><%# DataBinder.Eval(Container.DataItem, "AGE")%></td> 
      <td style="border: 1px solid grey;"><asp:LinkButton ID="btn" runat="server" Text=">>>>" OnCommand="btnDetails_Command" CommandArgument='<%# Eval("ID") %>' /></td> 
     </tr> 
    </ItemTemplate> 

    <FooterTemplate> 
     </table> 
    </FooterTemplate> 

</asp:Repeater> 

     <br /> 
<asp:Button ID="sendMail" runat="server" Text="send" OnClick="sendmail_Clicked" /> 
</asp:Content> 

回答

1

1)儘量執行您的頁面(不是單一的中繼器):

private string LoadMailTemplate() 
    { 
     var sb = new StringBuilder(); 

     using (var sw = new StringWriter(sb)) 
     { 
      this.Server.Execute(this, sw, false); 
     } 

     return sb.ToString(); 
    } 

其中this是你的頁面類。

2)你也可以把你的中繼器的控制。下面是執行控制的機身碼:

public static string LoadMailTemplate(string templatePath)  
{ 
       var page = new Page(); 
       Control myControl = page.LoadControl(templatePath); 
       var sb = new StringBuilder();  
       page.Controls.Add(myControl); 

       using (var sw = new StringWriter(sb)) 
       { 
        page.Server.Execute(page, sw, false); 
       } 

       return sb.ToString(); 
} 

電話:

string emailBody = LoadMailTemplate("~/modules/eurolight/MailTemplates/OrderMailTemplate.ascx"); 
+0

什麼的templatePath? – Camilla

+0

它是一個控制的路徑。例如templatePath =「〜/ modules/eurolight/MailTemplates/OrderMailTemplate.ascx」。 但是首先嚐試執行yor頁面(不使用控件) – algreat

+0

ok ok,templatepath是我的asp頁面的路徑 – Camilla

0

電子郵件是不是一個asp.net頁面。因爲你僅限於平面的HTML控件。我將更改鏈接按鈕更改爲錨標記並將其鏈接回您的Web應用程序,並根據查詢字符串加載詳細信息。

+0

你知道一些我可以看看的例子嗎? – Camilla

+0

你在找什麼或例子? Litmus.com會給你你可以在電子郵件中做的事情。 –

0

你需要這個代碼:

Public Overrides Sub VerifyRenderingInServerForm(control As Control) 

End Sub 
+0

最好解釋這段代碼應該去哪裏以及爲什麼用戶應該使用它 – CodingIntrigue