如何复制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
此外,该解决方案是行不通的,我也不认为我甚至接近正对正确的轨道上。只是想我会展示我试过的东西。
如果你重写页面的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”中是否需要任何代码? – brettwbyron
不,这应该只是抑制你得到的异常......“说我的文本框需要放在一个runat =”server“的表格里面”。 – N0Alias
我得到一个错误'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();
}
我想尽量在这段代码中尽可能地变成香草。因此,使用第三方分析器(虽然看起来很棒的解析器)并不是解决这个问题的理想方案。 – brettwbyron
你可以在VB中写出这个吗?即使我不使用它,我也想尝试一下。我目前在 'var table = root.Descendants()。这里有一个问题,其中(n => n.GetAttributeValue(“id”,“”).Equals(“Table1”)。Single(); ' 在我的代码(VB),它看起来像...... '昏暗表= root.Descendants()。如果...' 使用 和我得到的错误'Where'功能。 – brettwbyron
我我从来没有使用VB(只有VBA),所以我不知道,我知道有一个网站或两个网站可以在两者之间进行转换,但不知道为什么那一行不行,只有猜测是缺少使用语句(Linq?)。 – wazz
你能截图并发送它吗? – wazz
其中的一部分?该表的错误或样本? – brettwbyron
啊,不,我的意思是作为问题的答案,你可以截图(如果需要,还可以提交表格),然后发送给邮件列表中的人员。 – wazz