【问题标题】:How can I copy HTML ASP.NET VB Form/Table to send as email如何复制 HTML ASP.NET VB 表单/表格以作为电子邮件发送
【发布时间】:2018-03-30 19:23:34
【问题描述】:

我有一些大的、专门根据客户要求格式化的带有输入的表格。它看起来类似于以下...

<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

我尝试使用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

同样,这个解决方案不起作用,我认为我什至没有接近正确的轨道。只是想我会展示我的尝试。

【问题讨论】:

  • 你能截个图发过来吗?
  • 哪一部分?错误还是表格样本?
  • 啊,不,我的意思是作为问题的答案,你能不能截个屏幕截图(必要时还可以提交表单)并发送给电子邮件列表中的人。
  • @wazz,表单由用户提交。假设用户不知道如何使用计算机,因为那是我能得到的最接近事实的情况,哈哈!

标签: asp.net vb.net forms email html-email


【解决方案1】:

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

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

【讨论】:

  • 在我上面的代码示例中看起来如何? Sub 中是否需要任何代码?
  • 不,这应该只是抑制你得到的那个异常......“说我的文本框需要在一个带有 runat="server" 的表单中”。
  • 我收到一个错误RegisterForEventValidation can only be called during Render();
  • 哈哈,这个解决方案越来越笨拙了。查看此链接以获取有关如何解决该错误的信息:stackoverflow.com/questions/7228718/…
  • 好的。所以,在添加&lt;%@ Page ............ EnableEventValidation="false" %&gt; 之后,它就可以工作了!!我将整个表格作为电子邮件发送。但是,出于某种原因,每个输入都被括号括起来。我不知道为什么,但在你的帮助下我向前迈出了一大步。
【解决方案2】:

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

【讨论】:

  • 我想在这段代码中尽可能地保持原样。因此,使用第三方解析器(虽然看起来很棒的解析器)并不是解决这个问题的理想方案。
  • 你能用VB写出来吗?即使我不使用它,我也想尝试一下。我目前遇到var table = root.Descendants().Where(n =&gt; n.GetAttributeValue("id", "").Equals("Table1").Single(); 行的问题,在我的代码(VB)中,它看起来像...Dim table = root.Descendants().Where...,我使用Where 函数时遇到错误。
  • 我从未使用过 VB(只有 VBA),所以不确定。我知道有一两个在线网站可以在两者之间进行转换。不知道为什么那一行行不通。唯一的猜测是缺少 using 语句(Linq?)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多