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

How can I copy HTML ASP.NET VB Form/Table to send as email

我有几个大的,专门根据客户的要求格式化的,tables 带输入。它看起来类似于以下...

<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>

平淡无奇,对吧?

四个 table 中只有一个可见或不可见,具体取决于在 DropDownList 中选择的选项。每个 table 有超过 30-40 个输入,每个输入区域的格式都是唯一的。所有格式都相同(^^^如上^^^),但一个部分可能有 3 个输入和大量文本或 8 个输入和少量文本或没有输入和只有一段文本。

希望所有这些都有意义。

我需要弄清楚的是如何让用户能够通过 SubmitLinkButton "Submit" 表单,这将发送一封看起来与他们填写的表单相同的电子邮件到SystemFramwork.config.

中设置的电子邮件地址组

我尝试过使用 Visual BasicRenderControl() 来做到这一点,但我不断收到错误消息,提示我的文本框需要位于包含 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

同样,这个解决方案没有用,我认为我什至没有走上正确的轨道。只是想展示一下我的尝试。

如果您覆盖页面的 VerifyRenderingInServerForm 方法以不执行导致问题的验证,您可以解决此问题:

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

我可以使用这个版本,但没有返回任何用户输入。 这会将 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();
}