Использование дублированных идентификаторов управления asp.net в разных условных блоках / валидаторах - PullRequest
1 голос
/ 22 декабря 2009

У меня есть страница 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 не является уникальным идентификатором. Но точно ли это, если вывод является условным и эксклюзивным?

Я мог бы переименовать их в TextBoxNameA (блок if) и TextBoxNameB (блок else), но странным является то, что валидатор все еще работает с TextBoxNameB, , даже если валидатор находится внутри блока else и код выполняется через первый блок во время выполнения

Как настроить страницу для отображения одного или другого блока, без конфликтующих идентификаторов и конфликтующих валидаторов?

Спасибо за любую помощь

Ryan

Ответы [ 3 ]

1 голос
/ 22 декабря 2009

Как насчет перемещения по вашей логике?

    <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." />
0 голосов
/ 22 декабря 2009

Поскольку текстовое поле «Имя» будет отображаться независимо от условия, вы можете просто удалить его из блока if, а затем просто условно отобразить текстовое поле SurName, и это должно решить вашу проблему.

0 голосов
/ 22 декабря 2009

Но на стороне сервера, как синтаксический анализатор должен различать два?

И при разборе он не сможет определить, должен ли он отображаться, а кто нет.

Необходимо предоставить каждому элементу управления на стороне сервера свой идентификатор, независимо от того, отображается ли он клиенту.

Вы можете реструктурировать свой код следующим образом, так как 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") %>' />
<% } %>

И больше никаких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...