在不同的条件块/验证器中使用重复的asp.net控件ID

时间:2009-12-22 13:24:32

标签: asp.net validation

我有一个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冲突和冲突的验证器?

感谢您的帮助

赖安

3 个答案:

答案 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文本框,这样可以解决你的问题。