2010-12-12 40 views
9

Le code côté asp.net suivant du contrôle:Comment supprimer l'attribut 'name' des contrôles serveur?

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

HTML tels Génère code:

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

attribut ID - comme il est nécessaire, mais comment puis-je supprimer 'name' attribuer? Il n'est pas nécessaire pour moi et est également trop long pour le transférer au navigateur de l'utilisateur.

Comment puis-je empêcher la génération d'attribut 'nom'? Merci

P.S. Je travaille sous ASP.NET 4.0

+0

Je ne pense pas que vous pouvez, ses noms comme ça lorsque vous entrez dans un titulaire de place, si vous voulez utiliser HTML pur ASP.net MVC –

+0

ou 1. n'utilisez pas les contrôles serveur 2. créer vos propres filtres à nettoyez le html –

+3

Etes-vous sûr de ne pas avoir besoin de 'name'? La valeur n'est pas renvoyée au serveur sur POST? Si ce n'est pas le cas ... pourquoi ne pas rendre une variable JavaScript à la place? –

Répondre

7

créer un filtre (classe qui hérite de Stream), attribuez à votre attribut HttpContext.Response.Filter, et il vous écraserait la méthode Write, pour supprimer tous les porte-noms du code HTML généré par :)

Voir cette page pour plus d'informations http://msdn.microsoft.com/en-us/library/system.web.httpresponse.filter.aspx

Mise à jour

regardant le code source pour TextBox il révèle que nom est ajouté à la Attributes -list pendant le rendu, il devrait donc être possible d'interférer avec le rendu de la classe TextBox et d'empêcher cet attribut d'être ajouté. Cela devrait faire

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

mise à jour une fois de plus

Comment pourrais-je oublier! Vous n'avez même pas besoin de sous-classer votre zone de texte. Dans asp.net, vous pouvez définir quel type HtmlTextWriter que vous souhaitez utiliser par le contrôle, de sorte que vous pouvez simplement configurer que chaque contrôle TextBox doit utiliser une instance de votre propre NoNamesHtmlTextWriter comme celui-ci

<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

la 3ème mise à jour - est une bonne suggestion. Je voudrais ajouter: nous ferions mieux d'avoir une sous-classe pour NoNameTextBox, et d'utiliser 'NoNmaesTextBoxAdapter' pour 'NoNameTextBox' seulement. – Budda

+0

IMO c'est double travail ... si vous sous-classer la TextBox de toute façon, pourquoi ne pas simplement remplacer Render pour utiliser le NoNamesHtmlTextWriter dedans là? –

+0

J'ai essayé le NoNamesHtmlTextWriter et ne semble pas fonctionner. Pour moi, le WriteAttribute n'est jamais appelé car mon TextBox a zéro attribut (le AttributeCollection est vide). Je ne sais pas ce que je fais mal, j'utilise. NET 4.0 – Shankar

1

ce que les contrôles de ASP.Net rendent dans attributs de nom, provient de la propriété UniqueID. Ce n'est pas forcément une bonne idée de le surcharger, puisque ASP.NET l'utilise pour localiser le contrôle sur la publication pour router les événements de publication de publication &. Cependant, si vous êtes sûr que cela est correct dans votre scénario, vous pouvez certainement remplacer la propriété UniqueID suite à la réponse de @Pauli Østerø. S'amuser!

+0

voir ma réponse mise à jour pour substituer le rendu d'un contrôle TextBox à l'échelle de l'application :) –

2

La définition de EnableViewState = "Faux" amincira le nom. Vous pouvez également créer une classe qui hérite du contrôle Textbox et remplacer la procédure de rendu pour ne pas inclure le nom.

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 

Sinon, si vous ne voulez pas avoir à ajouter le contrôle à l'exécution, vous pouvez faire votre CustomTextBox comme ServerControl afin que vous puissiez l'ajouter au moment de la conception.

+1

Bon point pour le sous-classement du TextBox. J'ai également mis à jour ma réponse pour cette approche, mais elle devrait être plus robuste pour filtrer l'attribut name du rendu réel plutôt que d'essayer de le détourner complètement. –

+3

"La définition de EnableViewState =" False "amincira le nom" - cela ne fonctionne pas – Budda

3

Pour une raison inconnue, la substitution WriteAttribute ne fonctionnait pas. Je l'ai remplacé par:

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

Et cela a fonctionné comme un charme. Aussi, si vous avez juste besoin d'un nom personnalisé que vous pouvez simplement remplacer la propriété UniqueID:

public class MyCustomControl : TextBox 
    { 

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


    } 

Merci pour votre aide!

+0

Le remplacement WriteAttribute() n'a pas fonctionné pour moi non plus. AddAttribute() a travaillé un charme. Merci! –

0

Je pense que le mieux est de changer la propriété de nom à même ID comme est ..

Essaye ci-dessous en utilisant Jquery sur document.ready(function(){})

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