how to remove 'name' attribute from server controls?

前端 未结 6 2033
别那么骄傲
别那么骄傲 2020-11-29 11:19

The following asp.net side code of control:


相关标签:
6条回答
  • 2020-11-29 11:53

    create a Filter (class that inherits from Stream), assign it to your HttpContext.Response.Filter attribute, and in it you would overwrite the Write method, to remove all the name-tags from the generated html :)

    See this page for more information http://msdn.microsoft.com/en-us/library/system.web.httpresponse.filter.aspx

    Update

    Looking at the sourcecode for TextBox it reveals that Name is actually added to the Attributes-list during render, so it should be possible to interfere with the rendering of the TextBox class and prevent this attribute from being added. This should do

    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);
        }
    }
    

    Update once more

    How could i forget! You don't even need to subclass your textbox. In asp.net you can define which HtmlTextWriter type you want to use per control, so you can just configure that every TextBox control should use an instance of your own NoNamesHtmlTextWriter like this

    <browsers>
      <browser refID="Default">
        <controlAdapters>
          <adapter 
            controlType="System.Web.UI.WebControls.TextBox"
            adapterType="NoNamesTextBoxAdapter" 
          />
        </controlAdapters>
      </browser>
    </browsers>
    
    public class NoNamesTextBoxAdapter : ControlAdapter
    {
        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 noNamesRender = new HtmlTextWriter(writer);
            base.Render(noNamesRender);
        }
    }
    
    0 讨论(0)
  • 2020-11-29 11:53

    Setting EnableViewState="False" will slim down the name. You can also make a class that inherits the Textbox Control and override the Render procedure to not include the name.

    Public Class CustomTextBox
        Inherits TextBox
        Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
            MyBase.Render(writer)
            'Simplified rendering of control...
            writer.WriteLine("<input type='text' id='" & MyBase.ClientID & "'>")        
        End Sub
    End Class
    
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
         Dim MyCustomTextBox As New CustomTextBox
         form1.Controls.Add(MyCustomTextBox)
    End Sub
    

    Alternatively, if you don't want to have to add the control at run-time, you can make your CustomTextBox as a ServerControl so that you can add it at design time.

    0 讨论(0)
  • 2020-11-29 11:55

    For some unknown reason the WriteAttribute override didn't work. I replaced it with:

    public override void AddAttribute(HtmlTextWriterAttribute key, string value)
    {
       if (key == HtmlTextWriterAttribute.Name) return;
       base.AddAttribute(key, value);
    }         
    

    And it worked like a charm. Also if you just need a custom Name you can just override the UniqueID property:

    public class MyCustomControl : TextBox
        {
    
            public override string UniqueID
            {
                get
                {
                    //return base.UniqueID;
                    return "test123";
                }
            }
    
    
        }
    

    Thanks for your help!

    0 讨论(0)
  • 2020-11-29 11:55

    You can override the name property and return whatever you want (http://referencesource.microsoft.com/#System.Web/xsp/system/Web/UI/HtmlControls/HtmlInputControl.cs).

    0 讨论(0)
  • 2020-11-29 12:12

    I think better is to change name property to same like ID is..

    Just try bellow by using Jquery on document.ready(function(){})

    document.ready(function(){
      $.each($('div').children(), function() {
            $(this).attr("name",$(this).attr("id"));
      });
    });
    
    0 讨论(0)
  • 2020-11-29 12:19

    what ASP.Net controls render in name attributes, comes from UniqueID property. It's not necessarily good idea to override it, since ASP.NET uses that to locate control on postback to route postback data & events. However, if you are sure it is ok in your scenario, you certainly can override UniqueID property following @Pauli Østerø's answer. Have fun!

    0 讨论(0)
提交回复
热议问题