2009-01-26 85 views
12

我有一个比特的ASPX代码使用eval生成到JavaScript函数的调用:如何将多个参数传递给Eval()?

ASP.NET(为了便于阅读):

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

这产生类似JavaScript来:

的Javascript(为了便于阅读):

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

注意:我已将生成的&“实体引用引号以提高可读性。

我现在需要一个3ND参数添加到javascript函数调用,一个标题:

使用Javascript(为了便于阅读)

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

注:我已经转换生成的&“实体引用引号以提高可读性。


有已经存在于代码隐藏文件是用于返回标题为一个项目的函数:

C#(代码省略可读性):

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

我知道上述功能可以使用类似于以下语法的aspx文件调用:

ASP.NET(包裹,代码省略,以提高可读性):

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

所以现在我想用这个功能包括对javascript函数的第三个参数。

从开始:

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

我需要改变: “Todo - Insert caption here

到一个电话:<%# GetItemText((MySomething)Container.DataItem) %>

盲目尝试显而易见的:

ASP.NET(包装为可读性):

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

但是,抱怨,因为Eval()只需要两个参数。


我试过略少obivous:

ASP.NET(为了便于阅读)

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

但是,这并不工作。


相关问题

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

asp.NET: How to access repeater generated elements?

回答

19

诀窍是不要将多个项目传递给eval,而是将多个eval传递给要用来格式化数据的任何内容。你也可以只做到了这种方式 - 这将一直保持演示文稿的aspx文件像你想...

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

我更喜欢这个答案。对不起Robert。 – 2009-11-23 16:51:38

1

如果LinkBut​​ton的是不是有些其他东西(如网格)内,只需设置在代码隐藏的OnClientClick属性像正常一样,使用string.Format。

如果它位于网格(或中继器或其他类似的东西)中,请使用FindControl或e.Row.Cells []和string.Format将其设置在RowDataBound事件中。如果使用e.Row.Cells [],则可以转储LinkBut​​ton服务器控件并输出普通的锚标记。

+0

它*是*是一个中继器,你给了我一个有效的想法。将OnClientClick设置为<%#GetClickClickText(Container.DataItem)%> – 2009-01-26 20:56:31

2

Robert C. Barth给我的解决问题的思路:

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

,然后将代码隐藏文件包含:

protected string GetItemClientClick(MySomething item) 
{ 
    ... 

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

    return szOnClientClick; 
} 

我真的宁愿保持演示文稿的ASPX,和代码隐藏中的业务逻辑 - 但现实世界通常不符合该模型。

3

我的绝招

的eval(“FLName”的eval(” FLFDID”, “{0}”)+ “/ {0}”)

评估和演示内部评估和演示

它为我工作!

0

斯科特Ivey的解决方案续,你也可以用它来包括,如果在你的eval语句声明:

例如下面将输出一个锚标记,如果该属性Url存在,否则它会输出一个跨度。

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