Пустой ввод отображается в скобках при использовании RenderControl ASP.NET VB HTML
Как псевдо-продолжение моего предыдущего вопроса.
Мой текущий код выглядит примерно так:
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="MyPage.aspx.vb" Inherits="Project.MyPage" EnableEventValidation="false" %>
<head>...</head>
<body id="Body" class="Window" runat="server">
<form id="MyForm" 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>
Метод, который имеет значение...
Public Sub SubmitLinkButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles SubmitLinkButton.Click
Dim result As String = vbNull
Dim sw As New StringWriter
Dim htmlWriter As New HtmlTextWriter(sw)
If (DropDownList.SelectedValue IsNot "") Then
Try
Select Case DropDownList.SelectedValue
Case "Table1"
htmlWriter.RenderBeginTag(HtmlTextWriterTag.Table)
Table1.RenderControl(htmlWriter)
Case "Table2"
htmlWriter.RenderBeginTag(HtmlTextWriterTag.Table)
Table2.RenderControl(htmlWriter)
End Select
htmlWriter.RenderEndTag()
htmlWriter.Flush()
result = sw.ToString()
Finally
htmlWriter.Close()
sw.Close()
End Try
With New [Reference To A Class]
.SendMyEmail("Email Header", result) 'Email(header, body)
End With
Else
'Do something else that isn't important right now
End If
End Sub
Public Overrides Sub VerifyRenderingInServerForm(control As Control)
'No code necessary
End Sub
Все это работает! Я принимаю форму, передает HTML в result
переменная, и отправляет его по электронной почте! Потрясающие!
Мои текущие проблемы:
A) Когда какой-либо пользовательский ввод пуст, пустой ввод отображается как [ ]
именно так. [
, 10 пробелов, затем ]
, К сожалению, это портит форматирование формы. Он написан так, чтобы выглядеть как ASCII-подобная таблица. Есть ли способ, чтобы пользовательский ввод не отображался как пустое пространство, разрешенное элементом ввода? (Например <asp:Textbox ... Columns="8" ...></asp:Textbox>
только показывая как (восемь пробелов).)
B) При отправке я получаю электронное письмо, но на веб-странице отображается сообщение "На странице может быть только один тег формы на стороне сервера". сообщение об ошибке. Существует только один тег формы. Разметка, которую вы видите в приведенном выше примере кода, является точной, хотя она и не является подробной.
C) Пользователь должен иметь возможность распечатать эту форму. В CSS есть особая настройка разрывов страниц, но как только это будет отправлено по электронной почте, таких разрывов страниц не существует. Как я могу получить эту форму, чтобы распечатать так, как хочет пользователь?
РЕДАКТИРОВАТЬ: я могу придумать одно исправление - отправить HTML-форму, напечатанную как-то. Сделайте что-нибудь наподобие печати в PDF и отправьте PDF в электронном письме вместо формы HTML. Любая помощь будет потрясающей!
РЕДАКТИРОВАТЬ: я изменил SubmitLinkButton_Click
код для просмотра каждой таблицы специально, а не всей формы.
1 ответ
Вы должны быть в состоянии получить и установить текстовое значение элемента управления из выделенного кода с помощью чего-то вроде (из /questions/42981785/tsikl-po-vsem-tekstovyim-polyam-v-forme-v-tom-chisle-vnutri-gruppovogo-polya/42981792#42981792):
' Function to find controls
Public Shared Function FindControlRecursive(ByVal list As List(Of Control), ByVal parent As Control, ByVal ctrlType As System.Type) As List(Of Control)
If parent Is Nothing Then
Return list
If parent.GetType Is ctrlType Then
list.Add(parent)
End If
For Each child As Control In parent.Controls
FindControlRecursive(list, child, ctrlType)
Next
Return list
End Function
Ваш код:
Case "Table1"
Dim allInputs As New List(Of Control)
For Each txtBox As TextBox In FindControlRecursive(allInputs, Me, GetType(TextBox))
If String.IsNullOrEmpty(txtBox.Text) Then
txtBox.Text = " "
End If
Next
htmlWriter.RenderBeginTag(HtmlTextWriterTag.Table)
Table1.RenderControl(htmlWriter)
Case "Table2"
'Rest of your code
Кстати, в своем комментарии я поместил 8 пробелов, очевидно, он был отформатирован в " ".