设置runat = server时输入名称和ID更改

时间:2011-04-26 14:59:52

标签: .net asp.net validation forms

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

对于验证,我在所有输入中运行runat = 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查看name和id值以查找控件。所以我不能使用asp控件。因为我使用了runat = server

的html控件

我感谢任何帮助

6 个答案:

答案 0 :(得分:26)

这是因为你正在使用MasterPages。

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

如果您需要在客户端脚本中引用控件ID和名称,则可以使用<%= first_name.ClientID %>

如果你正在使用.NET4,你可以使用ClientIDMode="Static"使生成的ID保持一致,尽管这会带来自己的ID冲突警告,例如,当使用同一个用户控件的多个实例时页。 Rick Strahl概述了那些here

但是,如果你使用的是ASP.NET验证器,那么一切都应该没问题。您应该使用ASP.NET TextBox control

,而不是使用HTML input
<asp:TextBox id="first_name" runat="server" CssClass="formright" />

答案 1 :(得分:16)

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" />"  />

请不要因为这种糟糕的编码习惯而对我有所帮助,它的目的是使name属性不会更改为.Net样式名称。

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

答案 2 :(得分:11)

ClientIDMode仅影响ID。如果你还需要管理name属性那么它就没用了。在我的例子中,我使用jQuery在客户端解决了这个问题。

$(function(){

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

});

答案 3 :(得分:7)

ClientIDMode="Static"添加到控件中,例如

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

这是.NET 4中的新功能。Official documentation

答案 4 :(得分:3)

您可以在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中验证,可以尝试以下答案: How can I access runat="server" ASP element using javascript?

或者,如果您想在客户端使用此ID,请执行以下操作:

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

答案 5 :(得分:0)

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