2009-10-19 15 views
2

J'utilise un oBout Grid control avec un modèle dans une zone de texte.ASP.NET Comment passer la valeur du conteneur comme argument javascript

Je voudrais passer un argument à un javascript, l'index de ligne actuel d'une grille lorsqu'un utilisateur clique dessus.

Mais le résultat de

onClick='setGridInEditMode(<%# Container.RecordIndex %>);' /> 

sort comme

 onClick="setGridInEditMode(&lt;%# Container.RecordIndex %>);" 

Est-il possible de passer la valeur du conteneur à javascript?

Voici le balisage en question.

<cc1:Grid ID="_TrustGrid" runat="server" 
     FolderStyle="Styles/style_7" 
     AllowAddingRecords="False" 
     AllowSorting="false" 
     AllowPageSizeSelection="False" 
     AllowPaging="False" 
     AllowMultiRecordEditing="true" 
     AutoGenerateColumns="False" 
     OnUpdatecommand="_TrustGrid_UpdateCommand" 
     OnRebind="_TrustGrid_Rebind"> 
    <Columns> 
     <cc1:Column AllowEdit="true" AllowDelete="false" HeaderText="Edit" Width="130" runat="server" /> 
     <cc1:Column DataField="TrustDocID" HeaderText="TrustDocID" Width="125" ReadOnly="false" AllowDelete="false" TemplateId="trustDocIDGridTemplate" /> 
    </Columns> 
    <Templates> 
     <cc1:GridTemplate ID="trustDocIDGridTemplate" ControlID="tb1" runat="server"> 
      <Template> 
       <asp:TextBox ID="trustDocIDTextBox" runat="server" 
        Visible="true" 
        Text='<%# Container.Value %>' 
        onClick= 'setGridInEditMode(<%# Container.RecordIndex %>);' /> 
      </Template> 
     </cc1:GridTemplate> 
    </Templates> 
</cc1:Grid> 

Répondre

2

Je mettrais un second coup de fil à l'appel de Darin pour l'utilisation discrète de JavaScript. Cependant, cela ne répond pas à votre question sur pourquoi ASP.NET fait cela.

La raison pour laquelle vous obtenez

onClick="setGridInEditMode(&lt;%# Container.RecordIndex %>);" 

est parce que les propriétés de liaison de données de contrôle du serveur vous oblige à lier directement à la propriété sans texte intermédiaire. Cela signifie que seulement Property="<%# ... %>" est autorisé.

Donc, dans votre cas, vous aurez besoin de dire ce que vous voulez dans un mode rond-point (même si je pense personnellement que cela est un peu plus claire et plus maintenable):

onClick='<%# String.Format("setGridInEditMode({0});", Container.RecordIndex) %>' 

(Surveillez votre simple et double citation cependant!)

Cette limitation s'applique seulement aux contrôles serveur et à leurs propriétés. Il ne s'applique pas au contenu littéral imbriqué d'un contrôle serveur (tels que des corps de modèles ou des panneaux) ni au HTML brut utilisé ailleurs, ce qui explique probablement pourquoi vous ne l'avez jamais remarqué auparavant.

+0

Pour l'instant, c'est la solution que je suis allé avec. Et j'ai également découvert que, en utilisant "DataBinder.Eval (..., format)" fonctionne de la même manière. – Sung

2

Au lieu de polluantes votre HTML avec des fonctions javascript comment de trouver une solution discrète en utilisant jQuery:

$(function() { 
    $('#_TrustGrid input[id*=trustDocIDTextBox]').each(function(index) { 
     $(this).click(function() { 
      setGridInEditMode(index); 
     }); 
    }); 
}); 

Si vous préférez la place plus solution ASP.NETish vous pouvez toujours le faire:

<asp:TextBox 
    ID="trustDocIDTextBox" 
    runat="server" 
    Visible="true" 
    Text='<%# Container.Value %>' 
    onclick='<%# "setGridInEditMode(" + Container.RecordIndex + ")" %>' />     
+0

@Darin: Merci pour la solution jQuery. Comme je ne fais que commencer avec jQuery selector, je n'ai pas réussi à faire fonctionner le code. J'ai posté la question de suivi à ceci ici: http://stackoverflow.com/questions/1592149/cannot-select-grid-element-through-jquery J'apprécierais si vous pourriez jeter un coup d'oeil à ce que je pourrais être mal faire. Merci. – Sung