имя входа и идентификатор изменяются при установке runat = server - PullRequest
24 голосов
/ 26 апреля 2011

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

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

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

<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

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

Ответы [ 6 ]

26 голосов
/ 26 апреля 2011

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

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

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

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

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

<asp:TextBox id="first_name" runat="server" CssClass="formright" />
16 голосов
/ 10 января 2013
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, поэтому сервер присоединяет его к основному дереву формы)

11 голосов
/ 22 августа 2013

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

$(function(){

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

});
7 голосов
/ 26 апреля 2011

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

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

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

3 голосов
/ 16 февраля 2015

Вы можете сделать проверку на странице 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, вы можете попробовать этот ответ: Как я могу получить доступ к ASP-элементу runat = "server", используя javascript?

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

protected override void OnPreRender(EventArgs e)
{
    first_name.ClientIDMode = ClientIDMode.Static;
}
0 голосов
/ 02 марта 2016

Ответ тот же, что и у @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"));
    });
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...