Как я могу скопировать 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
,
Я пытался сделать это, используя 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
Опять же, это решение не работает, и я не думаю, что я даже близок к тому, чтобы быть на правильном пути. Просто подумал, что покажу, что я пробовал.
2 ответа
Если вы переопределите метод 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();
}