2017-10-18 5 views
0

J'ai quelques grandes, spécifiquement formatées à la demande du client, tables avec entrée. Il ressemble à ce qui suit ...Comment puis-je copier HTML ASP.NET VB Formulaire/Table à envoyer par e-mail

<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> 

Underwhelming, non?

Une seule des quatre tables est visible ou non en fonction de la sélection choisie dans DropDownList. Chaque table a plus de 30-40 entrées et chaque zone avec des entrées est formatée uniquement. Tous formatés de la même façon (^^^ comme ci-dessus ^^^), mais on peut avoir une section avec 3 entrées et beaucoup de texte ou 8 entrées et peu de texte ou pas d'entrées et juste une section de texte.

Espérons que tout cela a du sens. Ce que je dois comprendre, c'est comment permettre à l'utilisateur de «soumettre» le formulaire via le SubmitLinkButton, ce qui enverra un e-mail identique au formulaire qu'ils ont rempli pour un groupe d'adresses e-mail configurées dans le SystemFramwork.config.

J'ai essayé de le faire, en utilisant Visual Basic, avec RenderControl(), mais je continuais à obtenir des erreurs en disant mes zones de texte nécessaires pour être à l'intérieur d'une forme avec runat="server" en elle, et comme vous pouvez le voir dans mon code ci-dessus je cela. Donc, je ne suis pas sûr de ce qui se passait là-bas. Puisque le formulaire est formaté de manière personnalisée, Si je ne peux pas rendre le formulaire HTML d'une page à l'autre pour le rendre identique, je ne sais pas d'autre option que d'ajouter manuellement le balisage à l'e-mail, ce qui semble juste une perte de temps et des licenciements dans le projet.

Toute idée serait grandement appréciée!

Je suis encore travaille actuellement avec une solution pseudo qui ressemble à quelque chose comme ça ...

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 

Encore une fois, cette solution ne fonctionne pas, et je ne pense que je suis même près d'être sur la bonne voie. Je pensais juste que je montrerais ce que j'ai essayé.

+0

Seriez-vous en mesure de prendre une capture d'écran et de l'envoyer? – wazz

+0

De quelle partie? L'erreur ou un échantillon de la table? – brettwbyron

+0

Ah, non, je veux dire comme une réponse au problème, pouvez-vous prendre une capture d'écran (et aussi soumettre le formulaire si nécessaire) et l'envoyer aux personnes sur la liste d'email. – wazz

Répondre

1

Si vous remplacez VerifyRenderingInServerForm Méthode de la page pour ne pas effectuer la validation qui est à l'origine du problème, vous pouvez contourner ce problème:

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

À quoi cela ressemblerait-il dans mon exemple de code ci-dessus? Y aurait-il du code nécessaire dans le 'Sub'? – brettwbyron

+0

Non, cela devrait simplement supprimer cette exception que vous receviez ... "disant que mes boîtes de texte devaient être dans un formulaire avec runat =" serveur "dedans. – N0Alias

+0

Je reçois une erreur 'RegisterForEventValidation ne peut être appelé que pendant Render();' – brettwbyron

1

J'ai eu cette version de travail, mais n'a pas obtenu de-entrée de l'utilisateur est retourné. Cela met le code HTML dans un e-mail; utilise 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(); 
} 
+0

Je veux essayer d'être aussi vanille que possible dans ce code. Donc, l'utilisation d'un analyseur tiers (bien qu'apparemment un excellent analyseur) n'est pas une solution idéale à ce problème. – brettwbyron

+0

Pourriez-vous écrire ceci dans VB? Même si je ne l'utilise pas, j'aimerais l'essayer. Je rencontre actuellement un problème avec la ligne 'var table = root.Descendants(). Où (n => n.GetAttributeValue (" id "," ") .Equals (" Table1 "). Single(); ' Dans mon code (VB), il ressemble ... ' la table Dim = root.Descendants(). Où ... ' et je reçois des erreurs à l'aide de la' WHERE' fonction. – brettwbyron

+0

I » Je n'ai jamais utilisé VB (seulement VBA) donc je ne sais pas, je sais qu'il y a un site ou deux en ligne qui peuvent convertir entre les deux, mais je ne sais pas pourquoi cette ligne ne fonctionnerait pas. – wazz