如何从服务器控件中删除'name'属性?

时间:2010-12-12 22:31:36

标签: asp.net html asp.net-4.0

以下asp.net端控制代码:

<asp:TextBox runat="server" ID="LimitTextBox" Text="20" ClientIDMode="Static" />

生成此类HTML代码:

<input name="ctl11$ctl00$ctl02$TeamPlayerSelector$LimitTextBox" 
    type="text" value="20" id="LimitTextBox">

ID属性 - 根据需要,但如何删除“name”属性?它不是我所必需的,也很长,无法将其传输到用户浏览器。

如何防止'name'属性生成?感谢

P.S。我在ASP.NET 4.0下工作

6 个答案:

答案 0 :(得分:7)

创建一个过滤器(继承自Stream的类),将其分配给您的HttpContext.Response.Filter属性,然后在其中覆盖Write方法,删除所有名称标签从生成的html:)

有关详细信息,请参阅此页面http://msdn.microsoft.com/en-us/library/system.web.httpresponse.filter.aspx

<强>更新

查看TextBox的源代码,它显示在呈现期间名称实际上已添加到Attributes - 列表中,因此应该可以干扰TextBox类的呈现并防止添加此属性。这应该

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

再次更新

我怎么会忘记!您甚至不需要对文本框进行子类化。在asp.net中,您可以定义每个控件要使用的HtmlTextWriter类型,因此您可以配置每个TextBox控件应该使用您自己的NoNamesHtmlTextWriter实例,如此

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

答案 1 :(得分:3)

由于某些未知原因,WriteAttribute覆盖不起作用。我把它改为:

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

它就像一个魅力。 此外,如果您只需要一个自定义名称,您只需覆盖UniqueID属性:

public class MyCustomControl : TextBox
    {

        public override string UniqueID
        {
            get
            {
                //return base.UniqueID;
                return "test123";
            }
        }


    }

感谢您的帮助!

答案 2 :(得分:2)

设置EnableViewState =“False”将减少名称。您还可以创建一个继承Textbox Control的类,并覆盖Render过程以不包含名称。

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

或者,如果您不想在运行时添加控件,可以将CustomTextBox设置为ServerControl,以便在设计时添加它。

答案 3 :(得分:1)

ASP.Net控件在名称属性中呈现的内容来自UniqueID属性。覆盖它不一定是好主意,因为ASP.NET使用它来定位回发上的控制以路由回发数据&amp;事件。但是,如果您确定在您的方案中没有问题,那么您肯定可以在@PauliØsterø的答案之后覆盖UniqueID属性。玩得开心!

答案 4 :(得分:0)

我认为更好的是将名称属性更改为与ID相同...

document.ready(function(){})

上使用Jquery尝试下面
document.ready(function(){
  $.each($('div').children(), function() {
        $(this).attr("name",$(this).attr("id"));
  });
});

答案 5 :(得分:0)

您可以覆盖 名称属性并返回您想要的任何内容(http://referencesource.microsoft.com/#System.Web/xsp/system/Web/UI/HtmlControls/HtmlInputControl.cs)。