Пустой ввод отображается в скобках при использовании 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 пробелов, очевидно, он был отформатирован в " ".

Другие вопросы по тегам