我有一个asp页面,它根据Request参数呈现控件。简化示例:
<% if (Request.QueryString["personType"] == "D") { %>
<asp:TextBox ID="TextBoxName" runat="server" Text='<%# Bind("first_name") %>' />
<asp:TextBox ID="TextBoxSurname" runat="server" Text='<%# Bind("surname") %>' />
<% } else { %>
<asp:TextBox ID="TextBoxName" runat="server" Text='<%# Bind("first_name") %>' />
<% } %>
<asp:RequiredFieldValidator ID="RequiredFieldValidator" runat="server"
ControlToValidate="TextBoxName" ErrorMessage="Please enter an name." />
但是,编译器和运行时抱怨TextBoxName不是unque ID。但肯定的是,如果输出是有条件的并且是排他性的吗?
我可以将它们重命名为TextBoxNameA(如果是块)和TextBoxNameB(else块),但奇怪的是,即使验证器在else块内并且代码运行,验证器似乎仍然在TextBoxNameB,上触发通过运行时的第一个块
如何设置页面以呈现一个或另一个框,而不会出现ID冲突和冲突的验证器?
感谢您的帮助
赖安
答案 0 :(得分:1)
如何绕过你的逻辑?
<asp:TextBox ID="TextBoxName" runat="server" Text='<%# Bind("first_name") %>' />
<% if (Request.QueryString["personType"] == "D") { %>
<asp:TextBox ID="TextBoxSurname" runat="server" Text='<%# Bind("surname") %>' />
<% } %>
<asp:RequiredFieldValidator ID="RequiredFieldValidator" runat="server"
ControlToValidate="TextBoxName" ErrorMessage="Please enter an name." />
答案 1 :(得分:0)
但是服务器端,解析器应该如何区分这两者呢?
虽然解析它将无法确定应该显示一个而不应该显示一个。
您需要为每个服务器端控件提供不同的ID,而不管它是否显示给客户端。
您可以像这样重构代码,因为TextBoxName
将始终显示(并使用相同的文字):
<asp:TextBox ID="TextBoxName" runat="server" Text='<%# Bind("first_name") %>' />
<% if (Request.QueryString["personType"] == "D") { %>
<asp:TextBox ID="TextBoxSurname" runat="server" Text='<%# Bind("surname") %>' />
<% } %>
没有问题。
答案 2 :(得分:0)
由于Name文本框无论条件如何都会显示出来,你可以将if块全部放在一起,然后只是有条件地显示SurName文本框,这样可以解决你的问题。