asp.net
2009-01-26 7 views 12 likes 
12

i ont un bit de code aspx qui utilise Eval pour générer un appel à une fonction javascript:Comment passer plusieurs paramètres à Eval()?

ASP.NET (raisons de lisibilité):

<asp:LinkButton runat="server" 
    OnClientClick='<%# Eval(
     "NodeGUID", 
     "return DoStuff(this, \"{0}\");") %>' 
    Text="Do stuff" /> 

cela génère javascript similaire à:

Javascript (encapsulées de lisibilité):

return DoStuff(this, 
     "3F2504E0-4F89-11D3-9A0C-0305E82C3301" 
    ); 

Note:J'ai converti le généré & quot; références d'entités entre guillemets pour la lisibilité.

j'ai besoin maintenant d'ajouter un paramètre 3nd à l'appel de fonction javascript, une légende:

Javascript (raccourcies pour des raisons de lisibilité)

return DoStuff(this, 
     "3F2504E0-4F89-11D3-9A0C-0305E82C3301", 
     "AllisonAngel.jpg" 
    ); 

Note:i ai converti le & généré; références d'entités entre guillemets pour la lisibilité.


Il existe déjà une fonction dans le fichier code-behind qui est utilisé pour retourner la légende d'un élément:

C# (code omis pour une meilleure lisibilité):

protected string GetItemText(MySomething item) 
{ 
    ... 
} 

Je sais que la fonction ci-dessus peut être appelée à partir du fichier ASPX en utilisant une syntaxe similaire à:

ASP.NET (enveloppé, le code omis, pour une meilleure lisibilité):

<asp:LinkButton ... runat="server" 
    Text="<%# GetItemText((MySomething)Container.DataItem) %>" 
    ... /> 

Alors maintenant, je veux utiliser cette fonction pour inclure le 3ème paramètre à la fonction javascript.

A partir de:

<asp:LinkButton runat="server" 
    OnClientClick='<%# Eval(
     "NodeGUID", 
     "return DoStuff(this, \"{0}\", \"Todo - Insert caption here\");") %>' 
    Text="Do stuff" /> 

je dois changer: "Todo - Insert caption here"

dans un appel à: <%# GetItemText((MySomething)Container.DataItem) %>

essayant Aveuglément l'évidence:

ASP.NET (enveloppé pour la lisibilité):

<asp:LinkButton runat="server" 
    OnClientClick='<%# Eval(
     "NodeGUID", 
     GetItemText((MySomething)Container.DataItem), 
     "return DoStuff(this, \"{0}\", \"{1}\");") %>' 
    Text="Do stuff" /> 

Mais cela se complique puisque Eval() ne prend que deux paramètres.


J'ai essayé un peu moins le obivous:

ASP.NET (encapsulées de lisibilité)

<asp:LinkButton runat="server" 
    OnClientClick='<%# Eval(
     "NodeGUID", 
     "return DoStuff(this, 
       \"{0}\", 
       \""+GetItemText((MySomething)Container.DataItem)+"\");") %>' 
    Text="Do stuff" /> 

Mais cela ne fonctionne pas non plus.


Questions connexes

ASP.NET: How to access repeater generated elements from javascript?

asp.NET: How to access repeater generated elements?

Répondre

19

L'astuce n'est pas de passer plusieurs éléments à un eval, mais de passer plusieurs eval à ce que vous voulez utiliser pour formater les données. Vous pouvez aussi venez de le faire de cette façon - qui aurait gardé la présentation dans le fichier ASPX comme vous voulez ...

<asp:LinkButton 
    runat="server" 
    OnClientClick='<%# string.Format(
      "return DoStuff(this, \"{0}\", \"{1}\");", 
      Eval("NodeGUID"), 
      GetItemText((MySomething)Container.DataItem)) %>' 
    Text="Do stuff" /> 
+0

J'aime mieux cette réponse. Désolé Robert. –

1

Si le LinkButton est pas à l'intérieur d'une autre chose (comme une grille), juste définir l'attribut OnClientClick dans le code-behind comme d'habitude, en utilisant string.Format.

S'il est dans une grille (ou un répéteur, ou quelque chose de cette nature), définissez-le dans l'événement RowDataBound à l'aide de FindControl ou e.Row.Cells [] et string.Format. Si vous utilisez e.Row.Cells [], vous pouvez probablement vider le contrôle serveur LinkButton et simplement afficher une balise d'ancrage normale.

+0

It * is * est un répéteur, et vous m'avez donné une idée qui fonctionne. Définissez OnClientClick sur <% # GetClickClickText (Container.DataItem)%> –

2

Robert C. Barth m'a donné l'idée qui résout le problème:

<asp:LinkButton runat="server" 
     OnClientClick="<%# GetItemClientClick((MySomething)Container.DataItem) %>" 
     Text="Do stuff" /> 

puis le fichier code-behind contient:

protected string GetItemClientClick(MySomething item) 
{ 
    ... 

    String szOnClientClick = 
     "return DeleteItem(this, "+ 
      Toolkit.QuotedStr(item.NodeGUID.ToString()) + ", "+ 
      Toolkit.QuotedStr(GetItemText(item))+");"; 

    return szOnClientClick; 
} 

j'aurais vraiment préféré garder la présentation dans le ASPX, et logique métier dans le code-behind - mais le monde réel n'est souvent pas conforme à ce modèle.

3

Mon Trick

Eval ("FLNAME", Eval (» FLFDID », "{0}") + "/ {0}")

Eval intérieur Eval

ça marche pour moi !!

0

vous pouvez essayer cette

'<'asp:HyperLink ID="hp" runat="server" CommandArgument='<%# Eval("SysID", "{0}")%>' 
      NavigateUrl='<%# String.Format("~/ReportViewer.aspx?RevID= {0} 
      & User={1}", Eval("ID"), Eval("USER")) %>' Target="_blank" %>'> 
</asp:HyperLink> 

http://afzal-gujrat.blogspot.com/2012/10/pass-more-evals-in-querystring-with.html

0

Suite de la solution de Scott Ivey, vous pouvez également l'utiliser pour inclure si les déclarations dans votre déclaration Eval:

Par exemple la sortie ci-dessous une balise d'ancrage si la propriété Url existe, sinon elle générera une plage.

<%# string.Format(Eval("Url") != null ? "<a href=\"{0}\">{1}</a>" : "<span>{1}</span>", Eval("Url"), Eval("Text")) %>"> 
Questions connexes