繁体   English   中英

如何复制HTML ASP.NET VB表单/表格以电子邮件形式发送

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

我有一些大的,带有专门针对客户要求的格式的输入表。 看起来类似于以下内容...

<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 “提交”表单,该SubmitLinkButton将向他们在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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM