Подтвердить что ты не робот

Имя входа и идентификатор меняются при установке runat = server

В моей форме мне нужно вставить разные входы типа "текст". Входы должны быть элементами управления html с именем и идентификаторами. Потому что я отправляю эту форму на внешний URL.

Для проверки я выполняю runat = server на всех входах, а затем могу использовать требуемый идентификатор.

Но проблема в том, что, когда я смотрю в источнике после посещения страницы, имя и идентификатор все изменены. например

<input id="first_name" class="formright" type="text" name="first_name" runat="server" />

изменяется на

<input name="ctl00$cphContent$first_name" type="text" id="ctl00_cphContent_first_name" class="formright">

Мне нужно использовать элементы управления html, потому что внешний postbackurl просматривает значения имени и идентификатора, чтобы найти элемент управления. Поэтому я не могу использовать элементы управления asp. Именно из-за этого я использовал html-элементы управления с runat = server

Я ценю любую помощь

4b9b3361

Ответ 1

Это потому, что вы используете MasterPages.

Элементы управления, содержащиеся на странице содержимого, получают динамический идентификатор на основе иерархии главной страницы, чтобы избежать дублирования идентификаторов.

Если вам нужно ссылаться на идентификаторы и имена элементов управления на стороне клиента script, вы можете использовать <%= first_name.ClientID %>.

Если вы используете .NET4, вы можете использовать ClientIDMode="Static", чтобы сделать сгенерированные идентификаторы согласованными, хотя в этом есть свой собственный ID- конфликтов, когда, например, используют несколько экземпляров одного и того же пользовательского элемента управления на странице. Рик Стралл описывает эти здесь.

Однако, если вы используете валидаторы ASP.NET, все должно быть хорошо. Вместо использования HTML input вы должны использовать элемент управления ASP.NET TextBox:

<asp:TextBox id="first_name" runat="server" CssClass="formright" />

Ответ 2

ClientIDMode="Static"

Это полезно блокирует идентификатор любого элемента управления runat = "server", однако не блокирует атрибут name для элемента ввода html.

Увидев в этом случае единственную причину, чтобы атрибут runat = "server" на входе должен использовать .Net-проверку, я бы предложил использовать внешнюю JS-библиотеку, такую ​​как jQuery, для ее обработки.

Если же, как и я, вам нужно изменить атрибут value, единственная работа, которую я вижу, довольно грязная. Если вы удалите runat = "server" из ввода, вы можете поместить серверный элемент управления, например литерал, в атрибут value = "".

Например:

<input id="first_name" class="formright" type="text" name="first_name" value="<asp:Literal id="litFirstNameValue" runat="server" />"  />

Пожалуйста, не заходите ко мне за такие плохие методы кодирования, он предназначен в качестве последнего средства устранения проблемы, чтобы атрибут name не менялся на имя стиля .NET.

Кто-нибудь еще знает о другом способе исправить имя? (Элемент формы не определен как runat = "server", но он встроен в обычную. Net-форму, поэтому сервер прикрепляет его к основному дереву формы)

Ответ 3

ClientIDMode влияет только на идентификаторы. если вам также нужно управлять атрибутом имени, тогда это бесполезно. В моем случае я решил это на стороне клиента с помощью jQuery.

$(function(){

    $("#inputname").prop("name",$("#inputname").prop("id"));

});

Ответ 4

Добавьте ClientIDMode="Static" в элемент управления, например

<asp:TextBox ID="first_name" runat="server" ClientIDMode="Static" />

Это новая функция .NET 4. Официальная документация.

Ответ 5

Вы можете выполнить проверку на странице asp:

 <asp:Label runat="server" AssociatedControlID="txtFullName" CssClass="hidden"></asp:Label>
        <asp:TextBox runat="server" ID="txtFullName" CssClass="user" MaxLength="25"></asp:TextBox>
        <asp:RegularExpressionValidator
            ID="regFullName"
            runat="server"
            CssClass="has-error"
            ControlToValidate="txtFullName"
            ValidationExpression="[a-zA-Z-'\s]+"
            ValidationGroup="ValidationGroupName"
            Display="Dynamic"
            OnServerValidate="regFullName">
        </asp:RegularExpressionValidator>

Если вы хотите проверить в JS, вы можете попробовать этот ответ: Как я могу получить доступ к runat = "server" ASP-элемент с использованием javascript?

Или, если вы хотите использовать этот идентификатор на стороне клиента, выполните следующие действия:

protected override void OnPreRender(EventArgs e)
{
    first_name.ClientIDMode = ClientIDMode.Static;
}

Ответ 6

Эти вопросы слишком велики - вам нужно изучить основы работы форм asp.net. Попробуйте эту статью в качестве отправной точки.

В основном после того, как вы поставили runat = server в теге, сервер берет на себя управление рендерингом и подключением входов до объектов на стороне сервера, поэтому это ожидаемое поведение.

Если вы хотите проверить на стороне сервера эту страницу, а затем отправить в другое место, вам, вероятно, придется заново создать сообщение на стороне сервера после завершения проверки.

Ответ 7

Вот такой же ответ, как @saplumbaga, но в чистом Javascript:

  • Это фиксирует каждый вход:

    window.addEventListener("load", function () {
        var fix = function(el) { el.setAttribute("name", el.getAttribute("id")); };
        var els = document.getElementsByTagName("input");
        for (var i = 0; i < els.length; i++) {
            fix(els[i]);
        }
        els = document.getElementsByTagName("select");
        for (var i = 0; i < els.length; i++) {
            fix(els[i]);
        }
        els = document.getElementsByTagName("textarea");
        for (var i = 0; i < els.length; i++) {
            fix(els[i]);
        }
    });
    
  • Для одного входа:

    window.addEventListener("load", function () {
        var el = document.getElementById("MyID");
        el.setAttribute("name", el.getAttribute("id"));
    });