我有一个带有两个用户控件的 VB ASP.NET Web 应用程序,每个控件都包含一个文本输入。有两个提交按钮,每个按钮对应一个用户控件。
单击按钮会添加其相应用户控件的实例。在大多数情况下,除了在特定情况下文本框的 ID 会混淆,从而混淆先前输入的值之外,这在很大程度上是可行的。
问题场景如下:
1) 单击第二个按钮(添加批准人按钮)两次,然后在两个结果文本框中输入一些值(为便于分析,使值不同)。
2) 单击第一个按钮(添加文档按钮)一次。(这里不需要在结果文本框中添加任何值。)
在这一点上,一切似乎都是正确的。查看页面源代码,我看到两个“审批者”文本框的 ID 为 ctl02_txtApprover 和 ctl03_txtApprover,一个“文档”文本框的 ID 为 ctl04_txtDocument。
- 再次单击第一个按钮(添加文档按钮)。
此时第一个“批准人”文本框中的值消失了。第二个“审批者”文本框中的值迁移到第一个“审批者”文本框中。查看页面源码,两个“Approver”文本框的 ID 已更改为 ctl03_txtApprover 和 ctl04_txtApprover。考虑到文本框 ID 已更改,迁移的值是有意义的。换句话说,ViewState 看起来正确,但控件 ID 不正确。
我已尽可能简单地编写代码并将其发布在这里。
默认.aspx
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WebApplicationUserControlTest._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:PlaceHolder ID="phDocument" runat="server" />
<asp:Button ID="btnAddDocument" runat="server" Text="Add Document" />
<br /><br />
<asp:PlaceHolder ID="phApprover" runat="server" />
<asp:Button ID="btnAddApprover" runat="server" Text="Add Approver" />
</form>
</body>
</html>
默认.aspx.vb
Public Class _Default
Inherits System.Web.UI.Page
Private Const VIEWSTATE_DOCUMENT_COUNT As String = "DocumentCount"
Private Const VIEWSTATE_APPROVER_COUNT As String = "ApproverCount"
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
ViewState(VIEWSTATE_DOCUMENT_COUNT) = 0
ViewState(VIEWSTATE_APPROVER_COUNT) = 0
Else
're-display any preexisting dynamic sections on postback
AddAllDocumentInfoSections()
AddAllApproverSections()
End If
End Sub
Protected Sub btnAddDocument_Click(sender As Object, e As EventArgs) Handles btnAddDocument.Click
ViewState(VIEWSTATE_DOCUMENT_COUNT) += 1
AddDocumentSection()
End Sub
Protected Sub btnAddApprover_Click(sender As Object, e As EventArgs) Handles btnAddApprover.Click
ViewState(VIEWSTATE_APPROVER_COUNT) += 1
AddApproverSection()
End Sub
Private Sub AddAllDocumentInfoSections()
For i As Integer = 0 To ViewState(VIEWSTATE_DOCUMENT_COUNT) - 1
AddDocumentSection()
Next
End Sub
Private Sub AddAllApproverSections()
For i As Integer = 0 To ViewState(VIEWSTATE_APPROVER_COUNT) - 1
AddApproverSection()
Next
End Sub
Private Sub AddDocumentSection()
Dim c As UserControl = LoadControl("~/Document.ascx")
phDocument.Controls.Add(c)
End Sub
Private Sub AddApproverSection()
Dim c As UserControl = LoadControl("~/Approver.ascx")
phApprover.Controls.Add(c)
End Sub
End Class
文档.ascx
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="Document.ascx.vb" Inherits="WebApplicationUserControlTest.Document" %><asp:TextBox ID="txtDocument" runat="server" /><br /><br />
审批人.ascx
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="Approver.ascx.vb" Inherits="WebApplicationUserControlTest.Approver" %><asp:TextBox ID="txtApprover" runat="server" /><br /><br />
我正在使用 Visual Studio 2010。目标框架是 4.0。我尝试更改 clientIDMode 但这似乎没有什么不同。我遇到了 .NET 的错误还是我的代码有问题?