如何将多个参数传递给Eval()?

时间:2009-01-26 20:07:06

标签: asp.net

我有一些使用Eval生成对javascript函数调用的aspx代码:

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"
   );

注意: 我已将生成的&amp; quot; 实体引用转换为引号以便于阅读。

我现在需要在javascript函数调用中添加一个第三个参数,标题为:

Javascript(为便于阅读而包装)

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

注意: 我已将生成的&amp; quot; 实体引用转换为引号以便于阅读。


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

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()只有两个参数。


我尝试了稍微不那么明显的事情:

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?

6 个答案:

答案 0 :(得分:20)

诀窍不是将多个项目传递给eval,而是将多个eval传递给您想要用于格式化数据的任何内容。您也可以这样做 - 这样可以将演示文稿保存在aspx文件中,就像您想要的那样......

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

答案 1 :(得分:3)

我的诡计

  

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

Eval内的Eval

它对我有用!!

答案 2 :(得分: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 :(得分:1)

如果LinkBut​​ton不在其他东西中(比如网格),只需使用string.Format在正常情况下设置代码隐藏中的OnClientClick属性。

如果它在网格(或转发器,或那种性质的东西)中,使用FindControl或e.Row.Cells []和string.Format在RowDataBound事件中设置它。如果你使用e.Row.Cells [],你可以转储LinkBut​​ton服务器控件,只输出一个普通的锚标签。

答案 4 :(得分:0)

你可以试试这个

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

答案 5 :(得分:0)

继续使用Scott Ivey的解决方案,您还可以使用它在Eval语句中包含if语句:

例如,如果属性 Url 存在,则下面将输出锚标记,否则将输出范围。

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