【问题标题】:how to remove 'name' attribute from server controls?如何从服务器控件中删除“名称”属性?
【发布时间】:2011-05-24 09:27:15
【问题描述】:

如下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 属性 - 是必需的,但如何删除“名称”属性?我不需要,而且传输到用户浏览器也太长了。

如何防止“名称”属性生成?谢谢

附:我在 ASP.NET 4.0 下工作

【问题讨论】:

  • 我不认为你可以,当你在内容占位符中输入它时,它的名称就像这样,如果你想要纯 HTML 使用 ASP.net MVC
  • 或 1. 不要使用服务器控件 2. 创建自己的过滤器来清理 html
  • 您确定不需要name 吗?该值不会在 POST 上发送回服务器?如果不是这样……为什么不渲染一个 JavaScript 变量呢?
  • @nick 好点,id 仅用于客户端 DOM 操作...名称是浏览器实际发布内容所必需的。

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


【解决方案1】:

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

更多信息请参见此页面http://msdn.microsoft.com/en-us/library/system.web.httpresponse.filter.aspx

更新

查看TextBox的源代码,可以发现Name实际上是在渲染过程中添加到Attributes-list中的,所以应该可以干扰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);
    }
}

【讨论】:

  • 第三次更新 - 是个好建议。我要补充一点:我们最好有一个 NoNameTextBox 的子类,并且仅将 'NoNmaesTextBoxAdapter' 用于 'NoNameTextBox'。
  • IMO 那是双重工作...如果您仍然要对 TextBox 进行子类化,为什么不直接覆盖 Render 以在其中使用 NoNamesHtmlTextWriter 呢?
  • 我尝试了 NoNamesHtmlTextWriter,但似乎不起作用。对我来说,WriteAttribute 永远不会被调用,因为我的 TextBox 的属性为零(AttributeCollection 为空)。我不知道我做错了什么,我使用的是 .NET 4.0
  • 我覆盖了 NoNamesHtmlTextWriter 的 OnAttributeRender 方法,并为“name”属性返回了“false”。那行得通。
  • 我遇到了和@Shankar 一样的问题,所以使用了OnAttributeRender。最后我发现我需要 name 属性,但它必须与 id 的值相同,所以我覆盖了 AddAttribute 并更改了名称值。
【解决方案2】:

由于某些未知原因,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";
            }
        }


    }

感谢您的帮助!

【讨论】:

  • WriteAttribute() 覆盖对我也不起作用。 AddAttribute() 很有魅力。谢谢!
【解决方案3】:

设置 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,以便在设计时添加。

【讨论】:

  • 对 TextBox 进行子类化的好点。我也为这种方法更新了我的答案,但是从实际渲染中过滤出名称属性应该比试图完全劫持它更强大。
  • "设置 EnableViewState="False" 会缩小名称" - 这不起作用
【解决方案4】:

ASP.Net 控件在 name 属性中呈现的内容,来自 UniqueID 属性。重写它不一定是好主意,因为 ASP.NET 使用它来定位回发控件以路由回发数据和事件。但是,如果您确定在您的场景中没问题,您当然可以在 @Pauli Østerø 的回答之后覆盖 UniqueID 属性。玩得开心!

【讨论】:

  • 查看我在应用程序范围内覆盖 TextBox 控件呈现的更新答案 :)
【解决方案5】:

我认为最好将 name 属性更改为与 ID 相同的属性..

只需在 document.ready(function(){}) 上使用 Jquery 试试下面的操作

document.ready(function(){
  $.each($('div').children(), function() {
        $(this).attr("name",$(this).attr("id"));
  });
});

【讨论】:

    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      相关资源
      最近更新 更多