【问题标题】:How to pass multiple parameters to Eval()?如何将多个参数传递给 Eval()?
【发布时间】:2009-01-26 20:07:05
【问题描述】:

我有一些使用 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"
   );

注意: 为了便于阅读,我已将生成的 " 实体引用转换为引号。

我现在需要在 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

拨打电话:&lt;%# GetItemText((MySomething)Container.DataItem) %&gt;

盲目地尝试显而易见的事情:

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?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    诀窍不是将多个项目传递给一个 eval,而是将多个 eval 传递给任何你想用来格式化数据的东西。你也可以这样做——这会像你想要的那样将演示文稿保存在 aspx 文件中......

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

    【讨论】:

    • 我更喜欢这个答案。对不起罗伯特。
    【解决方案2】:

    我的秘诀

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

    Eval 中的 Eval

    它对我有用!

    【讨论】:

      【解决方案3】:

      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 中保留表示,而在代码隐藏中保留业务逻辑 - 但现实世界通常不符合该模型。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • It is 是一个中继器,你给了我一个可行的想法。将 OnClientClick 设置为
        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

          你可以试试这个

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

          【讨论】:

            猜你喜欢
            • 2010-11-03
            • 2014-02-01
            • 1970-01-01
            • 1970-01-01
            • 2020-11-07
            • 1970-01-01
            • 2018-08-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多