以下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下工作
答案 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(){})
document.ready(function(){
$.each($('div').children(), function() {
$(this).attr("name",$(this).attr("id"));
});
});
答案 5 :(得分:0)