我可以强制asp设置与id相同的名称

Por*_*rco 9 asp.net-4.0

我需要处理一个充满各种不同搜索控件的表单,但是这些搜索控件现在位于母版页内,因此id中添加了额外的垃圾('ct100 $ Body $ TextBox_Postal'而不是'TextBox_Postal') .

我能够通过设置ClientIDMode = CliendIDMode.Static来解决这个问题,这很好用,因为它不会尝试在id中包含命名容器.我相信页面上永远不会有两个相同的控件,所以这会起作用.

问题是,当回发表单时,控件将按名称处理.名称仍然是'ct1200 $ Body $ ..'格式,因此processform函数无法找到任何控件.有没有办法让ASP在"静态"模式下设置名称?

Ica*_*rus 13

我认为没有办法正确设置控件的名称,但你可以使用JQuery轻松更改名称,如果这是你的选择.

这里的例子

一些解释:

  • 假设你有这样的标记:

    <div>
        <asp:textbox runat="server"  id="staticid1" />
        <asp:textbox runat="server"  id="staticid2" />
        <asp:textbox runat="server"  id="staticid3" />
    </div>
    
    Run Code Online (Sandbox Code Playgroud)

您可以自动更改所有这些控件名称,使其名称与其ID相同window.load:

 $.each($('div').children(), function() {
      $(this).attr("name",$(this).attr("id"));
   });
Run Code Online (Sandbox Code Playgroud)

为了完成这项工作,你所需要的就是包括JQuery; 您可以使用Google的CDN:http: //ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js


ric*_*ott 2

简短的回答是否定的,您必须重写名称属性的呈现,以下问题来自此问题:ASP.NET:如何从服务器控件中删除“名称”属性?

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);
    }
}
Run Code Online (Sandbox Code Playgroud)