我需要处理一个充满各种不同搜索控件的表单,但是这些搜索控件现在位于母版页内,因此id中添加了额外的垃圾('ct100 $ Body $ TextBox_Postal'而不是' TextBox_Postal')。
我能够通过设置ClientIDMode = CliendIDMode.Static来解决这个问题,这很有用,因为它不会尝试在id中包含命名容器。我相信页面上永远不会有两个相同的控件,所以这会起作用。
问题是,当回发表单时,控件将按名称处理。名称仍然是'ct1200 $ Body $ ..'格式,因此processform函数无法找到任何控件。有没有办法让ASP在“静态”模式下设置名称?
答案 0 :(得分:13)
我认为没有办法正确设置控件的名称,但您可以使用JQuery轻松更改其名称,如果这是您的选项。
一些解释:
假设你有这样的标记:
<div>
<asp:textbox runat="server" id="staticid1" />
<asp:textbox runat="server" id="staticid2" />
<asp:textbox runat="server" id="staticid3" />
</div>
您可以自动更改所有这些控件名称,使其名称与其在window.load
上执行类似操作的ID相同:
$.each($('div').children(), function() {
$(this).attr("name",$(this).attr("id"));
});
为了完成这项工作你需要的只是JQuery;你可以使用谷歌的CDN: http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
答案 1 :(得分:2)
简短回答是否定的,您必须覆盖名称属性的呈现,例如下面的问题:ASP.NET: how to remove 'name' attribute from server controls?
public class NoNamesTextBox : TextBox
{
private class NoNamesHtmlTextWriter : HtmlTextWriter
{
public NoNamesHtmlTextWriter(TextWriter writer) : base(writer) {}
public override void WriteAttribute(string name, string value, bool fEncode)
{
if (name.Equals("name", StringComparison.OrdinalIgnoreCase)) return;
base.WriteAttribute(name, value, fEncode);
}
}
protected override void Render(HtmlTextWriter writer)
{
var noNamesWriter = new NoNamesHtmlTextWriter(writer);
base.Render(noNamesWriter);
}
}