asp.net

asp.net - ¿Cómo pasar múltiples parámetros a Eval()?



(6)

Tengo un poco de código aspx que usa Eval para generar una llamada a una función de JavaScript:

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 (envuelto para facilitar la lectura):

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

Nota: he convertido los & quot; generados las referencias de las entidades en citas para la legibilidad.

ahora necesito agregar un 3er parámetro a la llamada a la función javascript, un título:

Javascript (envuelto para facilitar la lectura)

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

Nota: he convertido los & quot; generados las referencias de las entidades en citas para la legibilidad.

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

C # (código omitido para la legibilidad):

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, código omitido, para facilitar la lectura):

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

Entonces ahora quiero usar esta función para incluir el 3er parámetro a la función javascript.

Empezando desde:

<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 intentando 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é el ligeramente menos obvio:

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 tampoco funciona.

preguntas relacionadas

ASP.NET: ¿Cómo acceder a los elementos generados por el repetidor desde javascript?

asp.NET: ¿Cómo acceder a los elementos generados por el repetidor?


Si el LinkButton no está dentro de otra cosa (como una cuadrícula), simplemente configure el atributo OnClientClick en el código subyacente como es normal, utilizando string.Format.

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.


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

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


Mi truco

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

Eval inside Eval

¡Funciona para mí!


Continuando con la solución de Scott Ivey, también puede usar esto para incluir declaraciones if en su declaración Eval:

Por ejemplo, a continuación se generará 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")) %>">



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 la lógica empresarial en el código subyacente, pero el mundo real a menudo no se ajusta a ese modelo.