.net 当设置runat=server时,输入名称和id会更改

.net 当设置runat=server时,输入名称和id会更改,.net,asp.net,validation,forms,.net,Asp.net,Validation,Forms,在我的表格中,我需要插入“text”类型的不同输入。输入必须是带有名称和id的html控件。因为我将此表单发送到外部url 对于验证,我在所有输入中运行at=server,然后可以使用requiredfieldvalidator 但问题是,当我在访问页面后查看源代码时,名称和id都发生了更改。 比如说 <input id="first_name" class="formright" type="text" name="first_name" runat="server" />

在我的表格中,我需要插入“text”类型的不同输入。输入必须是带有名称和id的html控件。因为我将此表单发送到外部url

对于验证,我在所有输入中运行at=server,然后可以使用requiredfieldvalidator

但问题是,当我在访问页面后查看源代码时,名称和id都发生了更改。 比如说

<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会查看名称和id值来查找控件。所以我不能使用asp控件。这是因为我使用了带有runat=server的html控件


非常感谢您的帮助

这是因为您正在使用母版页

内容页中包含的控件采用基于母版页层次结构的动态ID,以避免ID重复

如果需要在客户端脚本中引用控件ID和名称,可以使用

如果您使用的是.NET4,则可以使用它来使生成的ID保持一致,不过,例如,当在一个页面上使用同一用户控件的多个实例时,它会附带自己的ID冲突警告。瑞克·斯特拉尔概述了这些

但是,如果您使用的是ASP.NET验证程序,那么一切都应该正常。您不应使用HTML
输入
,而应使用:


向控件添加
clientmode=“Static”
,例如

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

这可以有效地锁定任何runat=“server”控件的ID,但是它不会锁定html输入元素的“name”属性

在这个例子中,在输入中使用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" />"  />

请不要因为这种糟糕的编码实践而责怪我,这是一种万不得已的解决办法,可以防止名称属性更改为.Net样式的名称


还有其他人知道另一种修复名称的方法吗?(表单元素未定义为runat=“server”,但它嵌入到普通的.Net表单中,这就是服务器将其附加到主表单树的原因)

ClientIDMode只影响ID。若您还需要管理name属性,那个么它是无用的。在我的例子中,我用jQuery在客户端解决了这个问题

$(function(){

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

});

您可以在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>

以下是与@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]);
        }
    });
    

我必须使用html控件,因为外部postbackurl会查看名称和id值来查找控件。所以我不能使用asp控件。正因为如此,我在runat中使用了html控件=server@Ozkan:ASP.NET控件只是在客户端上呈现为标准HTML控件,因此,您的
asp:TextBox
仍将呈现为带有
ID
name
属性的HTML
input
。@那么,我如何为
asp:TextBox
设置
名称?我试过了,ID和名字也变了。。。而且
clientIDMode
也是不可能的,因为我们使用的是framework 3.5。@Ozkan:您可以用与HTML控件相同的方式指定
name
属性-您指定的任何不是TextBox属性的内容都将按原样呈现。@Town我试过了,很遗憾,ID和名称也会更改为另一个。这对我来说不是一个解决方案,因为不幸的是我使用的是framework 3.5。@Ozkan-好的,请记住这一点,以便您能够升级。这对我很有效,我添加了一个纯javascript版本,因为我总是尽可能避免使用jQuery。@Aplo虽然目的很好,但你应该为此编写自己的答案,不鼓励编辑其他答案来添加有意义的不同内容。请阅读你的链接的接受答案状态:“你编辑是为了让事情变得更好、更清晰、更有效——永远不要改变意思。”-我没有改变意思,只是把同一算法的另一个版本(有些人会说更好、更有效)放进去。总之,我发布了我自己的答案
 <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>
protected override void OnPreRender(EventArgs e)
{
    first_name.ClientIDMode = ClientIDMode.Static;
}
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"));
});