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

i tienen un poco de código aspx que utiliza Eval para generar una llamada a una función javascript:Cómo pasar múltiples parámetros a Eval()?

ASP.NET (envuelto para facilitar la lectura):

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

esto genera javascript similar a:

Javascript (ajustado para facilitar la lectura):

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

Nota:He convertido el generado & quot; entidades referencias a cotizaciones para legibilidad.

Ahora necesito agregar un parámetro de la 3a a la llamada a la función Javascript, una leyenda:

Javascript (ajustado para mejorar la legibilidad)

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

Nota:he convertido generado & quot; entidades referencias a cotizaciones para legibilidad.


ya existe una función en el archivo de código subyacente que se utiliza para devolver el título de un artículo:

C# (código omitido para facilitar la lectura):

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

sé que la función anterior se puede llamar desde el archivo aspx usando una sintaxis similar a:

ASP.NET (envuelto, el código se omite, para facilitar la lectura):

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

Así que ahora quiero usar esta función para incluir el tercero parámetro a la función de JavaScript.

partir de:

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

Necesito cambiar: "Todo - Insert caption here"

en una llamada a: <%# GetItemText((MySomething)Container.DataItem) %>

A ciegas tratando lo obvio:

ASP.NET (envuelto para facilitar la lectura):

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

Pero eso se queja, ya que Eval() solo toma dos parámetros.


Probé los poco menos obivous:

ASP.NET (envuelto para facilitar la lectura)

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

Pero eso no funciona bien.


preguntas relacionadas

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

asp.NET: How to access repeater generated elements?

Respuesta

19

El truco consiste en no pasar varios elementos a una evaluación, sino pasar múltiples evaluaciones a lo que quiera usar para formatear los datos. También podrías haber hecho de esta manera - que habría mantenido la presentación en el archivo aspx como usted quería ...

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

me gusta más esta respuesta. Lo siento Robert. –

1

Si el LinkButton no está dentro de alguna otra cosa (como una cuadrícula), acaba de establecer el atributo OnClientClick en el código subyacente como es normal, usando una cuerda. Formato.

Si está en una grilla (o repetidor, o algo de esa naturaleza), configúrelo en el evento RowDataBound usando FindControl o e.Row.Cells [] y string.Format. Si usa e.Row.Cells [], probablemente pueda volcar el control del servidor LinkButton y simplemente generar una etiqueta de anclaje normal.

+0

It * is * es un repetidor, y me diste una idea de que funciona. Establezca el OnClientClick en <% # GetClickClickText (Container.DataItem)%> –

2

Robert C. Barth me dio la idea de que resuelve el problema:

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

y luego el archivo de código subyacente contiene:

protected string GetItemClientClick(MySomething item) 
{ 
    ... 

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

    return szOnClientClick; 
} 

realmente hubiera preferido mantener la presentación en el aspx, y lógica empresarial en el código subyacente, pero el mundo real a menudo no se ajusta a ese modelo.

3

Mi truco

Eval ("FLName", Eval (" FLFDID", "{0}") + "/ {0}")

Eval dentro Eval

que funcione para mí !!

0

puede probar esta

'<'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

Continuación de la solución de Scott Ivey, también se puede usar esto para incluir si las declaraciones en su estado de cuenta Eval:

Por ejemplo el siguiente es la salida una etiqueta de anclaje si la propiedad Url existe, de lo contrario generará un tramo.

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