如何复制 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 Basic
和 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
同样,这个解决方案没有用,我认为我什至没有走上正确的轨道。只是想展示一下我的尝试。
如果您覆盖页面的 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();
}
我有几个大的,专门根据客户的要求格式化的,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 Basic
和 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
同样,这个解决方案没有用,我认为我什至没有走上正确的轨道。只是想展示一下我的尝试。
如果您覆盖页面的 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();
}