使用RenderControl ASP.NET VB HTML时,空输入显示为括号

时间:2017-10-20 12:54:56

标签: html asp.net vb.net forms rendercontrol

作为previous question的伪跟进。

我目前的代码与以下内容类似:

<%@ 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)在提交时,我收到了电子邮件,但网页显示“一个页面只能有一个服务器端表单标签”。错误信息。只有一个Form标签。您在上面的示例代码中看到的标记是准确的,即使它没有详细说明。

C)用户需要能够打印出此表格。 CSS中有特定的分页符设置,但一旦通过电子邮件发送,这些分页符就不存在了。如何让这个表格打印出用户想要的方式?

编辑:我能想到的一个解决方法是以某种方式发送HTML表单。执行类似打印到PDF的操作并在电子邮件中发送PDF而不是“呈现的HTML表单”。任何帮助都会很棒!

编辑:我更改了SubmitLinkButton_Click代码,专门查看每个表格,而不是整个表格。

1 个答案:

答案 0 :(得分:1)

您应该能够从代码隐藏中检索和设置控件的文本值,例如(来自https://stackoverflow.com/a/4674181/2953322):

' 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个空格,显然格式化为“”。