在我的表单中,我需要插入“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控件我感谢任何帮助
答案 0 :(得分:26)
这是因为你正在使用MasterPages。
内容页面中包含的控件采用基于母版页层次结构的动态ID,以避免重复ID。
如果您需要在客户端脚本中引用控件ID和名称,则可以使用<%= first_name.ClientID %>
。
如果你正在使用.NET4,你可以使用ClientIDMode="Static"
使生成的ID保持一致,尽管这会带来自己的ID冲突警告,例如,当使用同一个用户控件的多个实例时页。 Rick Strahl概述了那些here。
但是,如果你使用的是ASP.NET验证器,那么一切都应该没问题。您应该使用ASP.NET TextBox control:
,而不是使用HTMLinput
<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"));
});