如何复制HTML ASP.NET VB Form/Table作为电子邮件发送

问题描述:

我有几个大的,特别是格式符合客户的请求,输入表。它看起来类似于以下...如何复制HTML ASP.NET VB Form/Table作为电子邮件发送

<body id="Body" class="Window" runat="server"> 
    <form id="Form" runat="server" defaultbutton="SubmitLinkButton"> 
     <!-- Markup for a the SubmitLinkButton and DropDownList --> 
     <!-- to pick which Table is shown     --> 
     <asp:Table ID="Table1" runat="server"> 
      <asp:TableRow class="row" runat="server"> 
       <asp:TableCell runat="server"> 
        <pre> Some Input1 </pre> 
        <pre>___________________</pre> 
        <pre>|___<asp:Textbox ID="Textbox1" runat="server"></asp:Textbox>____|</pre> 
        <pre>|_________________|</pre> 
       </asp:TableCell> 
      </asp:TableRow> 
     </asp:Table> 
     <asp:Table ID="Table2" runat="server"> 
      <asp:TableRow class="row" runat="server"> 
       <asp:TableCell runat="server"> 
        <pre> Some Input2 </pre> 
        <pre>___________________</pre> 
        <pre>|___<asp:Textbox ID="Textbox2" runat="server"></asp:Textbox>____|</pre> 
        <pre>|_________________|</pre> 
       </asp:TableCell> 
      </asp:TableRow> 
     </asp:Table> 
    </form> 
</body> 

不幸的是,对不对?

根据在DropDownList中选择的选项,四个表格中只有一个可见或不可见。每个表格有30-40个以上的输入,每个输入区域的格式都是唯一的。所有格式都是相同的(^^^就像上面的^^^),但也可以有一个带有3个输入和大量文本或8个输入,小文本或没有输入的部分,以及一段文本。

希望所有这些都有道理。

我需要弄清楚的是如何让用户能够通过SubmitLinkButton“提交”表单,该表单将发送一封与他们填写的表单相同的电子邮件给设置在SystemFramwork.config

我试图做到这一点,利用​​3210,与RenderControl(),但我一直得到错误,说是在它runat="server"一个形式里面需要我的文本框,并且你可以在我的代码见上面我有。所以,我不确定那里发生了什么。

由于表格的格式是如此自定义的,如果我无法以某种方式将HTML表单从页面呈现给电子邮件以使它们看起来完全相同,我不知道除了手动将标记添加到电子邮件之外,这看起来像浪费时间并在项目中造成冗余。

任何有识之士将不胜感激!

我目前仍与看起来像这样一个伪解决方案的工作...

Public Sub SubmitLinkButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SubmitLinkButton.Click 
    Dim result As String = vbNull 

    Dim stringWriter As New StringWriter() 
    Dim htmlWriter As New HtmlTextWriter(stringWriter) 

    'If the user selected something with the DropDown 
    If (DDL_Selection IsNot "") 
     Dim email As New MailMessage(FromConfigVar, ToConfigVar) 
     email.Subject = DDL_Selection.SelectedValue & " Table" 
     email.IsBodyHtml = True 

     Select Case DDL_Selection 
      Case "Table1" 
       Try 
        htmlWriter.RenderBeginTag(HtmlTextWriterTag.Table) 
        Table1.RenderControl(htmlWriter) 
        htmlWriter.RenderEndTag() 
        htmlWriter.Flush() 

        result = stringWriter.ToString() 
       Finally 
        htmlWriter.Close() 
        stringWriter.Close() 
       End Try 
     End Select 
     mailMessage.Body = result 
    Else 
     'Do nothing 
    End If 
End Sub 

此外,该解决方案是行不通的,我也不认为我甚至接近正对正确的轨道上。只是想我会展示我试过的东西。

+0

你能截图并发送它吗? – wazz

+0

其中的一部分?该表的错误或样本? – brettwbyron

+0

啊,不,我的意思是作为问题的答案,你可以截图(如果需要,还可以提交表格),然后发送给邮件列表中的人员。 – wazz

如果你重写页面的VerifyRenderingInServerForm法不执行,是造成你能解决这个问题的问题验证:

'This is in the Page's Code Behind. 
Public Overrides Sub VerifyRenderingInServerForm (control As Control) 
    'Do Nothing instead of raise exception. 
End Sub 
+0

这在我上面的代码示例中看起来如何? “Sub”中是否需要任何代码? – brettwbyron

+0

不,这应该只是抑制你得到的异常......“说我的文本框需要放在一个runat =”server“的表格里面”。 – N0Alias

+0

我得到一个错误'RegisterForEventValidation只能在Render()期间调用;' – brettwbyron

我得到这个版本的工作,但没有得到任何用户输入返回。 这将html放入电子邮件;使用HtmlAgilityPack。

using HtmlAgilityPack; 
etc. 

protected void btnTableToEmail_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     StringWriter sw = new StringWriter(); 
     using(HtmlTextWriter writer = new HtmlTextWriter(sw)) 
     { 
      writer.AddAttribute("runat", "server"); 
      writer.RenderBeginTag("form"); 

      writer.Write(GetTableHTML()); 

      writer.RenderEndTag(); 
     } 

     SendEmail(sw); 
    } 
    catch(Exception) 
    { 
     throw; 
    } 
} 

private string GetTableHTML() 
{ 
    // uses HtmlAgilityPack. 

    var html = new HtmlDocument(); 
    html.Load(Server.MapPath("~/yourpage.aspx")); // load a file 
    var root = html.DocumentNode; 

    var table = root.Descendants().Where(n => n.GetAttributeValue("id", "").Equals("Table1")).Single(); 
    return table.InnerHtml; 
} 

private void SendEmail(StringWriter sw) 
{ 
    // your email routine. 
    // ... 
    msg.Body = sw.ToString(); 
} 
+0

我想尽量在这段代码中尽可能地变成香草。因此,使用第三方分析器(虽然看起来很棒的解析器)并不是解决这个问题的理想方案。 – brettwbyron

+0

你可以在VB中写出这个吗?即使我不使用它,我也想尝试一下。我目前在 'var table = root.Descendants()。这里有一个问题,其中(n => n.GetAttributeValue(“id”,“”).Equals(“Table1”)。Single(); ' 在我的代码(VB),它看起来像...... '昏暗表= root.Descendants()。如果...' 使用 和我得到的错误'Where'功能。 – brettwbyron

+0

我我从来没有使用VB(只有VBA),所以我不知道,我知道有一个网站或两个网站可以在两者之间进行转换,但不知道为什么那一行不行,只有猜测是缺少使用语句(Linq?)。 – wazz