2010-12-12 102 views
9

控制的以下asp.net側代碼:如何從服務器控件中刪除'name'屬性?

<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

我不認爲你可以,它的名字就像當你在一個contenct的佔位符中輸入它時,如果你想純HTML使用ASP.net MVC – 2010-12-12 22:36:09

+0

或1.不要使用服務器控件2.創建你自己的過濾器清理html – 2010-12-12 22:38:03

+3

你確定你不需要'name'嗎?該值不會在POST後發送回服務器?如果情況並非如此...爲什麼不用JavaScript代替? – 2010-12-12 22:38:23

回答

7

創建一個過濾器(繼承自Stream的類),將其分配給您的HttpContext.Response.Filter屬性,並在其中覆蓋Write方法,從生成的html中刪除所有名稱標籤:)

瞭解更多信息http://msdn.microsoft.com/en-us/library/system.web.httpresponse.filter.aspx

更新

看到這個頁面看一下源代碼爲TextBox它表明名稱實際上是添加到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控件應該這樣

<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

第三次更新 - 是很好的建議。我會補充一點:我們最好有一個NoNameTextBox的子類,並且只爲'NoNameTextBox'使用'NoNmaesTextBoxAdapter'。 – Budda 2010-12-17 17:02:58

+0

國際海事組織這是雙重工作......如果你是無論如何繼承文本框,爲什麼不重寫渲染使用NoNamesHtmlTextWriter在那裏? – 2010-12-17 19:22:55

+0

我試過NoNamesHtmlTextWriter,似乎沒有工作。對我而言,WriteAttribute永遠不會被調用,因爲我的TextBox具有零屬性(AttributeCollection爲空)。我不知道我在做什麼錯,我正在使用.NET 4.0 – Shankar 2011-05-31 21:58:28

1

什麼ASP.Net控件呈現在使用自己的NoNamesHtmlTextWriter的實例名稱屬性來自UniqueID屬性。重寫它並不一定是好主意,因爲ASP.NET使用它來定位回發時的控件以路由回發數據&事件。但是,如果您確定自己的方案沒有問題,那麼您肯定可以覆蓋@PauliØsterø的答案後的UniqueID屬性。玩的開心!

+0

請參閱我的更新答案,以在應用程序範圍內覆蓋TextBox控件的渲染:) – 2010-12-12 23:28:13

2

設置EnableViewState =「False」將縮小名稱。您還可以創建一個繼承Textbox控件的類並覆蓋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,這樣就可以在設計時添加它。

+1

子類化TextBox的好處。我更新了我的答案,以及這種方法,但它應該更強大的過濾名稱屬性遠離實際渲染比試圖完全劫持它。 – 2010-12-12 23:13:49

+3

「設置EnableViewState =」False「將縮小名稱」 - 這不起作用 – Budda 2010-12-17 16:59:37

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


    } 

感謝您的幫助!

+0

WriteAttribute()覆蓋也不適用於我。 AddAttribute()發揮了魅力。謝謝! – 2017-02-14 05:09:19

0

我覺得更好的是名稱屬性更改爲同樣喜歡ID是..

document.ready(function(){})

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